diff options
author | Tae-Young Chung <ty83.chung@samsung.com> | 2015-08-02 14:51:58 +0900 |
---|---|---|
committer | Tae-Young Chung <ty83.chung@samsung.com> | 2015-08-02 14:52:41 +0900 |
commit | 6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929 (patch) | |
tree | 7f9464bdc97f155bd7910d9c21c6221feaf95354 | |
parent | b58273ff2547cde2ab6edcf2fca0530726f3efcc (diff) | |
download | libzint-6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929.tar.gz libzint-6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929.tar.bz2 libzint-6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929.zip |
Add Zint Barcode Generator
Change-Id: I5fe674ec5ee8ba7249edd988822990974e01da06
Signed-off-by: Tae-Young Chung <ty83.chung@samsung.com>
41 files changed, 26854 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a225ab7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +# (c) 2008 by BogDan Vatra < bogdan@licentia.eu > + +cmake_minimum_required(VERSION 2.6) +project(zint-package) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +#set(CMAKE_VERBOSE_MAKEFILE ON) +#comment or remove the above line before release + +add_definitions (-DZINT_VERSION=\"${ZINT_VERSION}\" -Wno-unused-variable -Wall ) + +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules" ) + +include (SetPaths.cmake) + +INCLUDE (CheckCXXCompilerFlag) + +if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC) + check_cxx_compiler_flag("-Wall" CXX_COMPILER_FLAG_WALL) + if (CXX_COMPILER_FLAG_WALL) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable -Wall") + endif (CXX_COMPILER_FLAG_WALL) +endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC) + +add_subdirectory(backend) + +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + +ADD_CUSTOM_TARGET(uninstall + "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") + +install(FILES cmake/modules/FindZint.cmake DESTINATION /usr/share/cmake/Modules COMPONENT Devel) + +# This needs to be run very last so other parts of the scripts can take +# advantage of this. +IF(NOT ZINT_HAS_BEEN_RUN_BEFORE) + SET(ZINT_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before") +ENDIF(NOT ZINT_HAS_BEEN_RUN_BEFORE) + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..965f935 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +# Make libzint and zint together + +zint: + $(MAKE) -C backend/ + +install: + $(MAKE) install -C backend/ + +uninstall: + $(MAKE) uninstall -C backend/ + +clean: + $(MAKE) clean -C backend/ + diff --git a/SetPaths.cmake b/SetPaths.cmake new file mode 100644 index 0000000..193aabc --- /dev/null +++ b/SetPaths.cmake @@ -0,0 +1,236 @@ +# - Find include and library dirs, and define a some macros +# +# This module defines a bunch of variables used as locations for install directories. +# They can be relative (to CMAKE_INSTALL_PREFIX) or absolute. +# Under Windows they are always relative. +# +# BIN_INSTALL_DIR - the directory where executables will be installed (default is prefix/bin) +# BUNDLE_INSTALL_DIR - Mac only: the directory where application bundles will be installed (default is /Applications/KDE4 ) +# SBIN_INSTALL_DIR - the directory where system executables will be installed (default is prefix/sbin) +# LIB_INSTALL_DIR - the directory where libraries will be installed (default is prefix/lib) +# CONFIG_INSTALL_DIR - the config file install dir +# DATA_INSTALL_DIR - the parent directory where applications can install their data +# HTML_INSTALL_DIR - the HTML install dir for documentation +# ICON_INSTALL_DIR - the icon install dir (default prefix/share/icons/) +# INFO_INSTALL_DIR - the kde info install dir (default prefix/info) +# KCFG_INSTALL_DIR - the install dir for kconfig files +# LOCALE_INSTALL_DIR - the install dir for translations +# MAN_INSTALL_DIR - the kde man page install dir (default prefix/man/) +# MIME_INSTALL_DIR - the install dir for the mimetype desktop files +# PLUGIN_INSTALL_DIR - the subdirectory relative to the install prefix where plugins will be installed (default is ${KDE4_LIB_INSTALL_DIR}/kde4) +# SERVICES_INSTALL_DIR - the install dir for service (desktop, protocol, ...) files +# SERVICETYPES_INSTALL_DIR - the install dir for servicestypes desktop files +# SOUND_INSTALL_DIR - the install dir for sound files +# TEMPLATES_INSTALL_DIR - the install dir for templates (Create new file...) +# WALLPAPER_INSTALL_DIR - the install dir for wallpapers +# DEMO_INSTALL_DIR - the install dir for demos +# KCONF_UPDATE_INSTALL_DIR - the kconf_update install dir +# XDG_APPS_INSTALL_DIR - the XDG apps dir +# XDG_DIRECTORY_INSTALL_DIR- the XDG directory +# XDG_MIME_INSTALL_DIR - the XDG mimetypes install dir +# DBUS_INTERFACES_INSTALL_DIR - the directory where dbus interfaces be installed (default is prefix/share/dbus-1/interfaces) +# DBUS_SERVICES_INSTALL_DIR - the directory where dbus services be installed (default is prefix/share/dbus-1/services ) +# +# A note on the possible values for CMAKE_BUILD_TYPE and how KDE handles +# the flags for those buildtypes. FindKDE4Internal supports the values +# Debug, Release, Relwithdebinfo, Profile and Debugfull +# +# Release +# optimised for speed, qDebug/kDebug turned off, no debug symbols +# Release with debug info +# optimised for speed, debugging symbols on (-g) +# Debug +# optimised but debuggable, debugging on (-g) +# (-fno-reorder-blocks -fno-schedule-insns -fno-inline) +# DebugFull +# no optimisation, full debugging on (-g3) +# Profile +# DebugFull + -ftest-coverage -fprofile-arcs +# +# It is expected that the "Debug" build type be still debuggable with gdb +# without going all over the place, but still produce better performance. +# It's also important to note that gcc cannot detect all warning conditions +# unless the optimiser is active. +# + +# Copyright (c) 2006-2008, Alexander Neundorf <neundorf@kde.org> +# Copyright (c) 2006, Laurent Montel, <montel@kde.org> +# Copyright (c) 2008, BogDan Vatra, <bogdan@licentia.eu> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + + +########## the following are directories where stuff will be installed to ########### +# +# this has to be after find_xxx() block above + +if (WIN32) +# use relative install prefix to avoid hardcoded install paths in cmake_install.cmake files + + set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}" ) # The subdirectory relative to the install prefix where libraries will be installed (default is ${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}) + + set(EXEC_INSTALL_PREFIX "" ) # Base directory for executables and libraries + set(SHARE_INSTALL_PREFIX "share" ) # Base directory for files which go to share/ + set(BIN_INSTALL_DIR "bin" ) # The install dir for executables (default ${EXEC_INSTALL_PREFIX}/bin) + set(SBIN_INSTALL_DIR "sbin" ) # The install dir for system executables (default ${EXEC_INSTALL_PREFIX}/sbin) + + set(LIBEXEC_INSTALL_DIR "${BIN_INSTALL_DIR}" ) # The subdirectory relative to the install prefix where libraries will be installed (default is ${BIN_INSTALL_DIR}) + set(INCLUDE_INSTALL_DIR "include" ) # The subdirectory to the header prefix + + set(PLUGIN_INSTALL_DIR "lib${LIB_SUFFIX}/kde4" ) # "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde4) + set(CONFIG_INSTALL_DIR "share/config" ) # The config file install dir + set(DATA_INSTALL_DIR "share/apps" ) # The parent directory where applications can install their data + set(HTML_INSTALL_DIR "share/doc/HTML" ) # The HTML install dir for documentation + set(ICON_INSTALL_DIR "share/icons" ) # The icon install dir (default ${SHARE_INSTALL_PREFIX}/share/icons/) + set(KCFG_INSTALL_DIR "share/config.kcfg" ) # The install dir for kconfig files + set(LOCALE_INSTALL_DIR "share/locale" ) # The install dir for translations + set(MIME_INSTALL_DIR "share/mimelnk" ) # The install dir for the mimetype desktop files + set(SERVICES_INSTALL_DIR "share/kde4/services" ) # The install dir for service (desktop, protocol, ...) files + set(SERVICETYPES_INSTALL_DIR "share/kde4/servicetypes" ) # The install dir for servicestypes desktop files + set(SOUND_INSTALL_DIR "share/sounds" ) # The install dir for sound files + set(TEMPLATES_INSTALL_DIR "share/templates" ) # The install dir for templates (Create new file...) + set(WALLPAPER_INSTALL_DIR "share/wallpapers" ) # The install dir for wallpapers + set(DEMO_INSTALL_DIR "share/demos" ) # The install dir for demos + set(KCONF_UPDATE_INSTALL_DIR "share/apps/kconf_update" ) # The kconf_update install dir + set(AUTOSTART_INSTALL_DIR "share/autostart" ) # The install dir for autostart files + + set(XDG_APPS_INSTALL_DIR "share/applications/kde4" ) # The XDG apps dir + set(XDG_DIRECTORY_INSTALL_DIR "share/desktop-directories" ) # The XDG directory + set(XDG_MIME_INSTALL_DIR "share/mime/packages" ) # The install dir for the xdg mimetypes + + set(SYSCONF_INSTALL_DIR "etc" ) # The kde sysconfig install dir (default /etc) + set(MAN_INSTALL_DIR "share/man" ) # The kde man install dir (default ${SHARE_INSTALL_PREFIX}/man/) + set(INFO_INSTALL_DIR "share/info" ) # The kde info install dir (default ${SHARE_INSTALL_PREFIX}/info)") + set(DBUS_INTERFACES_INSTALL_DIR "share/dbus-1/interfaces" ) # The kde dbus interfaces install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/interfaces)") + set(DBUS_SERVICES_INSTALL_DIR "share/dbus-1/services" ) # The kde dbus services install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/services)") + +else (WIN32) + + # This macro implements some very special logic how to deal with the cache. + # By default the various install locations inherit their value from their "parent" variable + # so if you set CMAKE_INSTALL_PREFIX, then EXEC_INSTALL_PREFIX, PLUGIN_INSTALL_DIR will + # calculate their value by appending subdirs to CMAKE_INSTALL_PREFIX . + # This would work completely without using the cache. + # But if somebody wants e.g. a different EXEC_INSTALL_PREFIX this value has to go into + # the cache, otherwise it will be forgotten on the next cmake run. + # Once a variable is in the cache, it doesn't depend on its "parent" variables + # anymore and you can only change it by editing it directly. + # this macro helps in this regard, because as long as you don't set one of the + # variables explicitely to some location, it will always calculate its value from its + # parents. So modifying CMAKE_INSTALL_PREFIX later on will have the desired effect. + # But once you decide to set e.g. EXEC_INSTALL_PREFIX to some special location + # this will go into the cache and it will no longer depend on CMAKE_INSTALL_PREFIX. + # + # additionally if installing to the same location as kdelibs, the other install + # directories are reused from the installed kdelibs + macro(_SET_FANCY _var _value _comment) + set(predefinedvalue "${_value}") + + if (NOT DEFINED ${_var}) + set(${_var} ${predefinedvalue}) + else (NOT DEFINED ${_var}) + set(${_var} "${${_var}}" CACHE PATH "${_comment}") + endif (NOT DEFINED ${_var}) + endmacro(_SET_FANCY) + + if(APPLE) + set(BUNDLE_INSTALL_DIR "/Applications/KDE4" CACHE PATH "Directory where application bundles will be installed to on OSX" ) + endif(APPLE) + + _set_fancy(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Base directory for executables and libraries") + _set_fancy(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share" "Base directory for files which go to share/") + _set_fancy(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" "The install dir for executables (default ${EXEC_INSTALL_PREFIX}/bin)") + _set_fancy(SBIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/sbin" "The install dir for system executables (default ${EXEC_INSTALL_PREFIX}/sbin)") + _set_fancy(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" "The subdirectory relative to the install prefix where libraries will be installed (default is ${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX})") + _set_fancy(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4/libexec" "The subdirectory relative to the install prefix where libraries will be installed (default is ${LIB_INSTALL_DIR}/kde4/libexec)") + _set_fancy(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" "The subdirectory to the header prefix") + + _set_fancy(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4" "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde4)") + _set_fancy(CONFIG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config" "The config file install dir") + _set_fancy(DATA_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/apps" "The parent directory where applications can install their data") + _set_fancy(HTML_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/doc/HTML" "The HTML install dir for documentation") + _set_fancy(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" "The icon install dir (default ${SHARE_INSTALL_PREFIX}/share/icons/)") + _set_fancy(KCFG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config.kcfg" "The install dir for kconfig files") + _set_fancy(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" "The install dir for translations") + _set_fancy(MIME_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/mimelnk" "The install dir for the mimetype desktop files") + _set_fancy(SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/kde4/services" "The install dir for service (desktop, protocol, ...) files") + _set_fancy(SERVICETYPES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/kde4/servicetypes" "The install dir for servicestypes desktop files") + _set_fancy(SOUND_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/sounds" "The install dir for sound files") + _set_fancy(TEMPLATES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/templates" "The install dir for templates (Create new file...)") + _set_fancy(WALLPAPER_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/wallpapers" "The install dir for wallpapers") + _set_fancy(DEMO_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/demos" "The install dir for demos") + _set_fancy(KCONF_UPDATE_INSTALL_DIR "${DATA_INSTALL_DIR}/kconf_update" "The kconf_update install dir") + _set_fancy(AUTOSTART_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/autostart" "The install dir for autostart files") + + _set_fancy(XDG_APPS_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/applications/kde4" "The XDG apps dir") + _set_fancy(XDG_DIRECTORY_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/desktop-directories" "The XDG directory") + _set_fancy(XDG_MIME_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/mime/packages" "The install dir for the xdg mimetypes") + + _set_fancy(SYSCONF_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/etc" "The kde sysconfig install dir (default ${CMAKE_INSTALL_PREFIX}/etc)") + _set_fancy(MAN_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/man" "The kde man install dir (default ${SHARE_INSTALL_PREFIX}/man/)") + _set_fancy(INFO_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/info" "The kde info install dir (default ${SHARE_INSTALL_PREFIX}/info)") + _set_fancy(DBUS_INTERFACES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/interfaces" "The kde dbus interfaces install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/interfaces)") + _set_fancy(DBUS_SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/services" "The kde dbus services install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/services)") + +endif (WIN32) + + +# The INSTALL_TARGETS_DEFAULT_ARGS variable should be used when libraries are installed. +# The arguments are also ok for regular executables, i.e. executables which don't go +# into sbin/ or libexec/, but for installing executables the basic syntax +# INSTALL(TARGETS kate DESTINATION "${BIN_INSTALL_DIR}") +# is enough, so using this variable there doesn't help a lot. +# The variable must not be used for installing plugins. +# Usage is like this: +# install(TARGETS kdecore kdeui ${INSTALL_TARGETS_DEFAULT_ARGS} ) +# +# This will install libraries correctly under UNIX, OSX and Windows (i.e. dll's go +# into bin/. +# Later on it will be possible to extend this for installing OSX frameworks +# The COMPONENT Devel argument has the effect that static libraries belong to the +# "Devel" install component. If we use this also for all install() commands +# for header files, it will be possible to install +# -everything: make install OR cmake -P cmake_install.cmake +# -only the development files: cmake -DCOMPONENT=Devel -P cmake_install.cmake +# -everything except the development files: cmake -DCOMPONENT=Unspecified -P cmake_install.cmake +# This can then also be used for packaging with cpack. + +set(INSTALL_TARGETS_DEFAULT_ARGS RUNTIME DESTINATION "${BIN_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}" + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" COMPONENT Devel ) + + +set(CMAKE_SYSTEM_INCLUDE_PATH ${CMAKE_SYSTEM_INCLUDE_PATH} + "${INCLUDE_INSTALL_DIR}") + +set(CMAKE_SYSTEM_PROGRAM_PATH ${CMAKE_SYSTEM_PROGRAM_PATH} + "${BIN_INSTALL_DIR}" ) + +set(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH} + "${LIB_INSTALL_DIR}" ) + + +###################################################### +# and now the platform specific stuff +###################################################### + +# Set a default build type for single-configuration +# CMake generators if no build type is set. +if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + + + +# setup default RPATH/install_name handling, may be overridden by KDE4_HANDLE_RPATH_FOR_[LIBRARY|EXECUTABLE] +# default is to build with RPATH for the install dir, so it doesn't need to relink +if (UNIX) + # add our LIB_INSTALL_DIR to the RPATH and use the RPATH figured out by cmake when compiling + set(CMAKE_INSTALL_RPATH ${LIB_INSTALL_DIR} ) + set(CMAKE_SKIP_BUILD_RPATH TRUE) + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +endif (UNIX) + diff --git a/backend/2of5.c b/backend/2of5.c new file mode 100644 index 0000000..df07f46 --- /dev/null +++ b/backend/2of5.c @@ -0,0 +1,117 @@ +/* 2of5.c - Handles Code 2 of 5 barcodes */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include "common.h" +#ifdef _MSC_VER +#include <malloc.h> +#endif + +static const char *C25MatrixTable[10] = {"113311", "311131", "131131", "331111", "113131", "313111", + "133111", "111331", "311311", "131311"}; + +static const char *C25IndustTable[10] = {"1111313111", "3111111131", "1131111131", "3131111111", "1111311131", + "3111311111", "1131311111", "1111113131", "3111113111", "1131113111"}; + +static const char *C25InterTable[10] = {"11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133", + "31131", "13131"}; + +static inline char check_digit(unsigned int count) +{ + return itoc((10 - (count % 10)) % 10); +} + +int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) +{ /* Code 2 of 5 Interleaved */ + + int i, j, k, error_number; + char bars[7], spaces[7], mixed[14], dest[1000]; +#ifndef _MSC_VER + unsigned char temp[length + 2]; +#else + unsigned char* temp = (unsigned char *)_alloca((length + 2) * sizeof(unsigned char)); +#endif + + error_number = 0; + + if(length > 89) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + + ustrcpy(temp, (unsigned char *) ""); + /* Input must be an even number of characters for Interlaced 2 of 5 to work: + if an odd number of characters has been entered then add a leading zero */ + if (length & 1) + { + ustrcpy(temp, (unsigned char *) "0"); + length++; + } + uconcat(temp, source); + + /* start character */ + strcpy(dest, "1111"); + + for(i = 0; i < length; i+=2 ) + { + /* look up the bars and the spaces and put them in two strings */ + strcpy(bars, ""); + lookup(NEON, C25InterTable, temp[i], bars); + strcpy(spaces, ""); + lookup(NEON, C25InterTable, temp[i + 1], spaces); + + /* then merge (interlace) the strings together */ + k = 0; + for(j = 0; j <= 4; j++) + { + mixed[k] = bars[j]; k++; + mixed[k] = spaces[j]; k++; + } + mixed[k] = '\0'; + concat (dest, mixed); + } + + /* Stop character */ + concat (dest, "311"); + + expand(symbol, dest); + ustrcpy(symbol->text, temp); + return error_number; + +} diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt new file mode 100644 index 0000000..be1a810 --- /dev/null +++ b/backend/CMakeLists.txt @@ -0,0 +1,25 @@ +# (c) 2008 by BogDan Vatra < bogdan@licentia.eu > + +project(zint) + +set(zint_COMMON_SRCS common.c library.c render.c ps.c large.c reedsol.c gs1.c png.c) +set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c) +set(zint_TWODIM_SRCS qr.c) +set(zint_SRCS ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_TWODIM_SRCS} ) + +add_definitions (-DNO_PNG) + +add_library(zint SHARED ${zint_SRCS}) + +SET_TARGET_PROPERTIES(zint + PROPERTIES + VERSION ${FULLVER} + SOVERSION ${MAJORVER} + CLEAN_DIRECT_OUTPUT 1 +) + +target_link_libraries(zint -lm) + +install(TARGETS zint ${INSTALL_TARGETS_DEFAULT_ARGS} ) +install(FILES zint.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel) +install(FILES LICENSE DESTINATION ${SHARE_INSTALL_PREFIX}/zint) diff --git a/backend/DEVELOPER b/backend/DEVELOPER new file mode 100644 index 0000000..7db3a77 --- /dev/null +++ b/backend/DEVELOPER @@ -0,0 +1,45 @@ +Contents +-------- + +Here is a guide to which bit of source code does what. + +2of5.c: + Matrix 2 of 5 + Industrial 2 of 5 + IATA 2 of 5 + Data Logic + Interleaved 2 of 5 + ITF-14 + Deutche Post Leitcode + Deutche Post Identcode + +code128.c: + Code 128 + Code 128 Subset B + NVE-18 + GS1-128 (UCC/EAN-128) + EAN-14 + +code.c: + Code 11 + Code 39 + Pharmazentral Nummer (PZN) + Extended Code 39 (Code 39+) + Code 93 + LOGMARS + Channel Code + +qr.c: + QR Code + Micro QR Code + +upcean.c: + UPC-A + UPC-E + EAN-2 add-on + EAN-5 add-on + EAN-8 + EAN-13 + SBN (verification) + ISBN (verification) + ISBN-13 (verification) diff --git a/backend/LICENSE b/backend/LICENSE new file mode 100644 index 0000000..723ef63 --- /dev/null +++ b/backend/LICENSE @@ -0,0 +1,13 @@ +ZINT was originally developed by Robin Stuart and licensed under the terms of the GPL (Gnu +Public License). In 2013 Robin Stuart and all developers that contributed to the code agreed +to change the license to a less restrictive one (see ZINT mailing list of May 2013 for +related mails) under the following conditions: +- the names of original copyright holder Robin Stuart and contributors are not removed, + neither from sources nor from the manual +- the documentation is done in British English (as Robin said: "Oh, and please don't + replace the word "colour" with "color" in the documentation - that really annoys me!") + +Change to BSD-license is done for backend and therefore for ZINT shared library only, for +the frontends and Qt4-backend the GPL is still valid. Since BSD-license is GPL-compatible +this gives the possibility to include ZINT library in own products or link against it from +own software. diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000..2f339dd --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,54 @@ +# Linux makefile for libzint +# +# make compiles +# make install copies to /usr/local/lib +# make uninstall removes library +# make clean cleans up a previous compilation and any object or editor files +# + +ZINT_VERSION:=-DZINT_VERSION=\"2.4.3.0\" + + +CC := gcc +INCLUDE := -I/usr/include +CFLAGS := -g + +prefix := /usr +includedir := $(prefix)/include +libdir := $(prefix)/lib +DESTDIR := + +COMMON:= common.c render.c png.c library.c ps.c large.c reedsol.c gs1.c svg.c +COMMON_OBJ:= common.o render.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o +ONEDIM:= code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c +ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o +POSTAL:= postal.c auspost.c imail.c +POSTAL_OBJ:= postal.o auspost.o imail.o +TWODIM:= code16k.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c +TWODIM_OBJ:= code16k.o dmatrix.o pdf417.o qr.o maxicode.o composite.o aztec.o code49.o code1.o gridmtx.o +LIBS:= `libpng15-config --I_opts --L_opts --ldflags` -lz -lm + +libzint: code.c code128.c 2of5.c upcean.c medical.c telepen.c plessey.c postal.c auspost.c imail.c code16k.c dmatrix.c reedsol.c pdf417.c maxicode.c rss.c common.c render.c png.c library.c ps.c qr.c large.c composite.c aztec.c gs1.c svg.c code49.c code1.c gridmtx.c + $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(ONEDIM) + $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(POSTAL) + $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(TWODIM) + $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(COMMON) + $(CC) $(CFLAGS) $(ZINT_VERSION) -shared -Wl,-soname,libzint.so -o libzint.so.2.4.3 $(INCLUDE) $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ) $(LIBS) + ln -s libzint.so.* libzint.so + +.PHONY: install uninstall clean dist + +install: + test "$(UID)" = "0" && ldconfig -n $(PWD) || true + install -d $(DESTDIR)$(libdir) + mv libzint.* $(DESTDIR)$(libdir) + install -D -p --mode=0644 zint.h $(DESTDIR)$(includedir)/zint.h + +uninstall: + rm $(DESTDIR)$(libdir)/libzint.* + rm $(DESTDIR)$(includedir)/zint.h + +clean: + rm -f libzint.* *.o *.a *~ + + diff --git a/backend/Makefile.mingw b/backend/Makefile.mingw new file mode 100644 index 0000000..87fc946 --- /dev/null +++ b/backend/Makefile.mingw @@ -0,0 +1,93 @@ +# Linux makefile for libzint +# +# make compiles with QR Code support +# make install copies to /usr/lib +# make uninstall removes library +# make clean cleans up a previous compilation and any object or editor files +# + +ZINT_VERSION:=-DZINT_VERSION=\"2.4.3.0\" + + +CC:= gcc -m32 +LD:= ld +AR:= ar rc +RANLIB:= ranlib +INCLUDE:= -I/mingw/include +CFLAGS:= -O2 -fms-extensions -mms-bitfields -fno-exceptions -fomit-frame-pointer -Wall +LDFLAGS = -Wl,--major-image-version=2 -Wl,--minor-image-version=43 +RC:= windres +RCFLAGS:= -v -F pe-i386 --define GCC_WINDRES + +prefix := /mingw +includedir := $(prefix)/include +libdir := $(prefix)/lib +bindir := $(prefix)/bin +DESTDIR := +APP:=zint +DLL:=$(APP).dll +DLLIMP:=lib$(DLL).a +STATLIB:=lib$(APP).a +TOOLLIB:=lib$(APP).la + +COMMON_OBJ:= common.o render.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o +ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o +POSTAL_OBJ:= postal.o auspost.o imail.o +TWODIM_OBJ:= code16k.o dmatrix.o pdf417.o qr.o maxicode.o composite.o aztec.o code49.o code1.o gridmtx.o + +LIB_OBJ:= $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ) +DLL_OBJ:= $(LIB_OBJ:.o=.lo) dllversion.lo + +ifeq ($(NO_PNG),true) +DEFINES+= -DNO_PNG +else +DEFINES_DLL+= -DPNG_DLL -DZLIB_DLL +LIBS+= -lpng -lz +endif + +LIBS+= -lm + +all: $(DLL) $(STATLIB) +DLL: $(DLL) +static: $(STATLIB) + +%.lo:%.c + @echo Compiling $< ... + $(CC) $(CFLAGS) $(DEFINES) $(DEFINES_DLL) -DDLL_EXPORT -DPIC $(ZINT_VERSION) -c -o $@ $< + +%.o:%.c + @echo Compiling $< ... + $(CC) $(CFLAGS) $(DEFINES) $(ZINT_VERSION) -c -o $@ $< + +libzint.o: libzint.rc + $(RC) $(RCFLAGS) -o $@ $< + +$(DLL):$(DLL_OBJ) libzint.o + @echo Linking $@... + $(CC) -shared -Wl,--out-implib,$(DLLIMP) $(LDFLAGS) -o $@ zint.def $(DLL_OBJ) libzint.o $(LIBS) + +$(STATLIB): $(LIB_OBJ) + @echo Linking $@... + $(AR) $@ $(LIB_OBJ) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +.PHONY: install uninstall clean dist + +install: + cp -fp $(DLLIMP) $(DESTDIR)$(libdir) + cp -fp $(STATLIB) $(DESTDIR)$(libdir) + cp -fp $(TOOLLIB) $(DESTDIR)$(libdir) + cp -fp zint.h $(DESTDIR)$(includedir)/zint.h + cp -fp $(DLL) $(DESTDIR)$(bindir) + +uninstall: + rm $(DESTDIR)$(libdir)/$(DLLIMP) + rm $(DESTDIR)$(libdir)/$(STATLIB) + rm $(DESTDIR)$(libdir)/$(TOOLLIB) + rm $(DESTDIR)$(includedir)/zint.h + rm $(DESTDIR)$(bindir)/$(DLL) + +clean: + rm -f *.lib *.dll *.o *.a *~ *.res *.exe *.lo *.bak + + diff --git a/backend/code.c b/backend/code.c new file mode 100644 index 0000000..9d30e5a --- /dev/null +++ b/backend/code.c @@ -0,0 +1,188 @@ +/* code.c - Handles Code 11, 39, 39+ and 93 */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +/* In version 0.5 this file was 1,553 lines long! */ + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include "common.h" + +#define SODIUM "0123456789-" +#define SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd" + +static const char *C11Table[11] = {"111121", "211121", "121121", "221111", "112121", "212111", "122111", + "111221", "211211", "211111", "112111"}; + + +/* Code 39 tables checked against ISO/IEC 16388:2007 */ + +/* Incorporates Table A1 */ + +static const char *C39Table[43] = { "1112212111", "2112111121", "1122111121", "2122111111", "1112211121", + "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121", + "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121", + "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211", + "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211", + "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111", + "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211", + "1211121211", "1112121211"}; +/* Code 39 character assignments (Table 1) */ + +static const char *EC39Ctrl[128] = {"%U", "$A", "$B", "$C", "$D", "$E", "$F", "$G", "$H", "$I", "$J", "$K", + "$L", "$M", "$N", "$O", "$P", "$Q", "$R", "$S", "$T", "$U", "$V", "$W", "$X", "$Y", "$Z", + "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J", + "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F", + "%G", "%H", "%I", "%J", "%V", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "%K", "%L", "%M", "%N", "%O", + "%W", "+A", "+B", "+C", "+D", "+E", "+F", "+G", "+H", "+I", "+J", "+K", "+L", "+M", "+N", "+O", + "+P", "+Q", "+R", "+S", "+T", "+U", "+V", "+W", "+X", "+Y", "+Z", "%P", "%Q", "%R", "%S", "%T"}; +/* Encoding the full ASCII character set in Code 39 (Table A2) */ + +static const char *C93Ctrl[128] = {"bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", + "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", + "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "cD", "cE", "cF", "cG", "cH", "cI", "cJ", + "cK", "cL", "cM", "cN", "cO", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", + "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO", + "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", + "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT"}; + +static const char *C93Table[47] = {"131112", "111213", "111312", "111411", "121113", "121212", "121311", + "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111", + "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122", + "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221", + "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131", + "121221", "312111", "311121", "122211"}; + +/* Global Variables for Channel Code */ +int S[11], B[11]; +long value; +long target_value; +char pattern[30]; + +int c39(struct zint_symbol *symbol, unsigned char source[], int length) +{ /* Code 39 */ + unsigned int i; + unsigned int counter; + char check_digit; + int error_number; + char dest[775]; + char localstr[2] = { 0 }; + + error_number = 0; + counter = 0; + + if((symbol->option_2 < 0) || (symbol->option_2 > 1)) { + symbol->option_2 = 0; + } + + if((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } else if(length > 74) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(SILVER , source, length); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + + /* Start character */ + strcpy(dest, "1211212111"); + + for(i = 0; i < length; i++) { + lookup(SILVER, C39Table, source[i], dest); + counter += posn(SILVER, source[i]); + } + + if((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) { + + counter = counter % 43; + if(counter < 10) { + check_digit = itoc(counter); + } else { + if(counter < 36) { + check_digit = (counter - 10) + 'A'; + } else { + switch(counter) { + case 36: check_digit = '-'; break; + case 37: check_digit = '.'; break; + case 38: check_digit = ' '; break; + case 39: check_digit = '$'; break; + case 40: check_digit = '/'; break; + case 41: check_digit = '+'; break; + case 42: check_digit = 37; break; + default: check_digit = ' '; break; /* Keep compiler happy */ + } + } + } + lookup(SILVER, C39Table, check_digit, dest); + + /* Display a space check digit as _, otherwise it looks like an error */ + if(check_digit == ' ') { + check_digit = '_'; + } + + localstr[0] = check_digit; + localstr[1] = '\0'; + } + + /* Stop character */ + concat (dest, "121121211"); + + if((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) { + /* LOGMARS uses wider 'wide' bars than normal Code 39 */ + counter = strlen(dest); + for(i = 0; i < counter; i++) { + if(dest[i] == '2') { + dest[i] = '3'; + } + } + } + + expand(symbol, dest); + + if(symbol->symbology == BARCODE_CODE39) { + ustrcpy(symbol->text, (unsigned char*)"*"); + uconcat(symbol->text, source); + uconcat(symbol->text, (unsigned char*)localstr); + uconcat(symbol->text, (unsigned char*)"*"); + } else { + ustrcpy(symbol->text, source); + uconcat(symbol->text, (unsigned char*)localstr); + } + return error_number; +} diff --git a/backend/code128.c b/backend/code128.c new file mode 100644 index 0000000..f0f985d --- /dev/null +++ b/backend/code128.c @@ -0,0 +1,1013 @@ +/* code128.c - Handles Code 128 and derivatives */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + Bugfixes thanks to Christian Sakowski and BogDan Vatra + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#ifdef _MSC_VER +#include <malloc.h> +#endif +#include "common.h" +#include "gs1.h" + +#define TRUE 1 +#define FALSE 0 +#define SHIFTA 90 +#define LATCHA 91 +#define SHIFTB 92 +#define LATCHB 93 +#define SHIFTC 94 +#define LATCHC 95 +#define AORB 96 +#define ABORC 97 + +#define DPDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*" + +static int list[2][170]; + +/* Code 128 tables checked against ISO/IEC 15417:2007 */ + +static const char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "2331112"}; +/* Code 128 character encodation - Table 1 */ + +int parunmodd(unsigned char llyth) +{ + int modd; + modd = 0; + + if(llyth <= 31) { modd = SHIFTA; } + else if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; } + else if(llyth <= 95) { modd = AORB; } + else if(llyth <= 127) { modd = SHIFTB; } + else if(llyth <= 159) { modd = SHIFTA; } + else if(llyth <= 223) { modd = AORB; } + else { modd = SHIFTB; } + + return modd; +} + +/** + * bring together same type blocks + */ +void grwp(int *indexliste) +{ + int i, j; + + /* bring together same type blocks */ + if(*(indexliste) > 1) { + i = 1; + while(i < *(indexliste)) { + if(list[1][i - 1] == list[1][i]) { + /* bring together */ + list[0][i - 1] = list[0][i - 1] + list[0][i]; + j = i + 1; + + /* decreace the list */ + while(j < *(indexliste)) { + list[0][j - 1] = list[0][j]; + list[1][j - 1] = list[1][j]; + j++; + } + *(indexliste) = *(indexliste) - 1; + i--; + } + i++; + } + } +} + +/** + * Implements rules from ISO 15417 Annex E + */ +void dxsmooth(int *indexliste) +{ /* Implements rules from ISO 15417 Annex E */ + int i, current, last, next, length; + + for(i = 0; i < *(indexliste); i++) { + current = list[1][i]; + length = list[0][i]; + if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; } + if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; } + + if(i == 0) { /* first block */ + if((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; } + if(current == ABORC) { + if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; current = AORB; } + } + if(current == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; } + if((current == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; current = LATCHA; } + if(current == AORB) { /* Rule 1d */ list[1][i] = LATCHB; } + } else { + if((current == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; current = LATCHC; } + if(current == ABORC) { list[1][i] = AORB; current = AORB; } + if((current == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } + if((current == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } + if((current == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; current = LATCHA; } + if((current == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; current = LATCHB; } + if(current == AORB) { list[1][i] = LATCHB; current = LATCHB; } + if((current == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; current = LATCHA; } + if((current == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; current = LATCHB; } + if((current == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } + if((current == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } + if((current == SHIFTA) && (last == LATCHC)) { list[1][i] = LATCHA; current = LATCHA; } + if((current == SHIFTB) && (last == LATCHC)) { list[1][i] = LATCHB; current = LATCHB; } + } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ + } + grwp(indexliste); + +} + +/** + * Translate Code 128 Set A characters into barcodes. + * This set handles all control characters NULL to US. + */ +void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) +{ /* Translate Code 128 Set A characters into barcodes */ + /* This set handles all control characters NULL to US */ + + if(source > 127) { + if(source < 160) { + concat(dest, C128Table[(source - 128) + 64]); + values[(*bar_chars)] = (source - 128) + 64; + } else { + concat(dest, C128Table[(source - 128) - 32]); + values[(*bar_chars)] = (source - 128) - 32; + } + } else { + if(source < 32) { + concat(dest, C128Table[source + 64]); + values[(*bar_chars)] = source + 64; + } else { + concat(dest, C128Table[source - 32]); + values[(*bar_chars)] = source - 32; + } + } + (*bar_chars)++; +} + +/** + * Translate Code 128 Set B characters into barcodes. + * This set handles all characters which are not part of long numbers and not + * control characters. + */ +void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) +{ + if(source > 127) { + concat(dest, C128Table[source - 32 - 128]); + values[(*bar_chars)] = source - 32 - 128; + } else { + concat(dest, C128Table[source - 32]); + values[(*bar_chars)] = source - 32; + } + (*bar_chars)++; +} + +void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) +{ /* Translate Code 128 Set C characters into barcodes */ + /* This set handles numbers in a compressed form */ + int weight; + + weight = (10 * ctoi(source_a)) + ctoi(source_b); + concat(dest, C128Table[weight]); + values[(*bar_chars)] = weight; + (*bar_chars)++; +} + +int code_128(struct zint_symbol *symbol, unsigned char source[], int length) +{ /* Handle Code 128 and NVE-18 */ + int i, j, k,values[170] = { 0 }, bar_characters, read, total_sum; + int error_number, indexchaine, indexliste, sourcelen, f_state; + char set[170] = { ' ' }, fset[170] = { ' ' }, mode, last_set, current_set = ' '; + float glyph_count; + char dest[1000]; + + error_number = 0; + strcpy(dest, ""); + + sourcelen = length; + + j = 0; + bar_characters = 0; + f_state = 0; + + if(sourcelen > 160) { + /* This only blocks rediculously long input - the actual length of the + resulting barcode depends on the type of data, so this is trapped later */ + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + + /* Detect extended ASCII characters */ + for(i = 0; i < sourcelen; i++) { + if(source[i] >= 128) + fset[i] = 'f'; + } + fset[i] = '\0'; + + /* Decide when to latch to extended mode - Annex E note 3 */ + j = 0; + for(i = 0; i < sourcelen; i++) { + if(fset[i] == 'f') { + j++; + } else { + j = 0; + } + + if(j >= 5) { + for(k = i; k > (i - 5); k--) { + fset[k] = 'F'; + } + } + + if((j >= 3) && (i == (sourcelen - 1))) { + for(k = i; k > (i - 3); k--) { + fset[k] = 'F'; + } + } + } + + /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */ + for(i = 1; i < sourcelen; i++) { + if((fset[i - 1] == 'F') && (fset[i] == ' ')) { + /* Detected a change from 8859-1 to 646 - count how long for */ + for(j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++); + if((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) { + /* Uses the same figures recommended by Annex E note 3 */ + /* Change to shifting back rather than latching back */ + for(k = 0; k < j; k++) { + fset[i + k] = 'n'; + } + } + } + } + + /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ + indexliste = 0; + indexchaine = 0; + + mode = parunmodd(source[indexchaine]); + if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { + mode = AORB; + } + + for(i = 0; i < 170; i++) { + list[0][i] = 0; + } + + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(source[indexchaine]); + if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { + mode = AORB; + } + } + indexliste++; + } while (indexchaine < sourcelen); + + dxsmooth(&indexliste); + + /* Resolve odd length LATCHC blocks */ + if((list[1][0] == LATCHC) && (list[0][0] & 1)) { + /* Rule 2 */ + list[0][1]++; + list[0][0]--; + if(indexliste == 1) { + list[0][1] = 1; + list[1][1] = LATCHB; + indexliste = 2; + } + } + if(indexliste > 1) { + for(i = 1; i < indexliste; i++) { + if((list[1][i] == LATCHC) && (list[0][i] & 1)) { + /* Rule 3b */ + list[0][i - 1]++; + list[0][i]--; + } + } + } + + /* Put set data into set[] */ + + read = 0; + for(i = 0; i < indexliste; i++) { + for(j = 0; j < list[0][i]; j++) { + switch(list[1][i]) { + case SHIFTA: set[read] = 'a'; break; + case LATCHA: set[read] = 'A'; break; + case SHIFTB: set[read] = 'b'; break; + case LATCHB: set[read] = 'B'; break; + case LATCHC: set[read] = 'C'; break; + } + read++; + } + } + + /* Adjust for strings which start with shift characters - make them latch instead */ + if(set[0] == 'a') { + i = 0; + do { + set[i] = 'A'; + i++; + } while (set[i] == 'a'); + } + + if(set[0] == 'b') { + i = 0; + do { + set[i] = 'B'; + i++; + } while (set[i] == 'b'); + } + + /* Now we can calculate how long the barcode is going to be - and stop it from + being too long */ + last_set = ' '; + glyph_count = 0.0; + for(i = 0; i < sourcelen; i++) { + if((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if((fset[i] == 'f') || (fset[i] == 'n')) { + glyph_count = glyph_count + 1.0; + } + if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if(set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + if(i == 0) { + if(fset[i] == 'F') { + glyph_count = glyph_count + 2.0; + } + } else { + if((fset[i] == 'F') && (fset[i - 1] != 'F')) { + glyph_count = glyph_count + 2.0; + } + if((fset[i] != 'F') && (fset[i - 1] == 'F')) { + glyph_count = glyph_count + 2.0; + } + } + + if(set[i] == 'C') { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + if(glyph_count > 80.0) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + + /* So now we know what start character to use - we can get on with it! */ + if(symbol->output_options & READER_INIT) { + /* Reader Initialisation mode */ + switch(set[0]) { + case 'A': /* Start A */ + concat(dest, C128Table[103]); + values[0] = 103; + current_set = 'A'; + concat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + bar_characters++; + break; + case 'B': /* Start B */ + concat(dest, C128Table[104]); + values[0] = 104; + current_set = 'B'; + concat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + bar_characters++; + break; + case 'C': /* Start C */ + concat(dest, C128Table[104]); /* Start B */ + values[0] = 105; + concat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + concat(dest, C128Table[99]); /* Code C */ + values[2] = 99; + bar_characters += 2; + current_set = 'C'; + break; + } + } else { + /* Normal mode */ + switch(set[0]) { + case 'A': /* Start A */ + concat(dest, C128Table[103]); + values[0] = 103; + current_set = 'A'; + break; + case 'B': /* Start B */ + concat(dest, C128Table[104]); + values[0] = 104; + current_set = 'B'; + break; + case 'C': /* Start C */ + concat(dest, C128Table[105]); + values[0] = 105; + current_set = 'C'; + break; + } + } + bar_characters++; + last_set = set[0]; + + if(fset[0] == 'F') { + switch(current_set) { + case 'A': + concat(dest, C128Table[101]); + concat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + concat(dest, C128Table[100]); + concat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + + /* Encode the data */ + read = 0; + do { + + if((read != 0) && (set[read] != current_set)) + { /* Latch different code set */ + switch(set[read]) + { + case 'A': concat(dest, C128Table[101]); + values[bar_characters] = 101; + bar_characters++; + current_set = 'A'; + break; + case 'B': concat(dest, C128Table[100]); + values[bar_characters] = 100; + bar_characters++; + current_set = 'B'; + break; + case 'C': concat(dest, C128Table[99]); + values[bar_characters] = 99; + bar_characters++; + current_set = 'C'; + break; + } + } + + if(read != 0) { + if((fset[read] == 'F') && (f_state == 0)) { + /* Latch beginning of extended mode */ + switch(current_set) { + case 'A': + concat(dest, C128Table[101]); + concat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + concat(dest, C128Table[100]); + concat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + if((fset[read] == ' ') && (f_state == 1)) { + /* Latch end of extended mode */ + switch(current_set) { + case 'A': + concat(dest, C128Table[101]); + concat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + concat(dest, C128Table[100]); + concat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 0; + } + } + + if((fset[read] == 'f') || (fset[read] == 'n')) { + /* Shift to or from extended mode */ + switch(current_set) { + case 'A': + concat(dest, C128Table[101]); /* FNC 4 */ + values[bar_characters] = 101; + break; + case 'B': + concat(dest, C128Table[100]); /* FNC 4 */ + values[bar_characters] = 100; + break; + } + bar_characters++; + } + + if((set[read] == 'a') || (set[read] == 'b')) { + /* Insert shift character */ + concat(dest, C128Table[98]); + values[bar_characters] = 98; + bar_characters++; + } + + switch(set[read]) + { /* Encode data characters */ + case 'a': + case 'A': c128_set_a(source[read], dest, values, &bar_characters); + read++; + break; + case 'b': + case 'B': c128_set_b(source[read], dest, values, &bar_characters); + read++; + break; + case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters); + read += 2; + break; + } + + } while (read < sourcelen); + + /* check digit calculation */ + total_sum = 0; + /*for(i = 0; i < bar_characters; i++) { + printf("%d\n", values[i]); + }*/ + + for(i = 0; i < bar_characters; i++) + { + if(i > 0) + { + values[i] *= i; + } + total_sum += values[i]; + } + concat(dest, C128Table[total_sum%103]); + + /* Stop character */ + concat(dest, C128Table[106]); + expand(symbol, dest); + return error_number; +} + +int ean_128(struct zint_symbol *symbol, unsigned char source[], int length) +{ /* Handle EAN-128 (Now known as GS1-128) */ + int i, j,values[170], bar_characters, read, total_sum; + int error_number, indexchaine, indexliste; + char set[170], mode, last_set; + float glyph_count; + char dest[1000]; + int separator_row, linkage_flag, c_count; +#ifndef _MSC_VER + char reduced[length + 1]; +#else + char* reduced = (char*)_alloca(length + 1); +#endif + error_number = 0; + strcpy(dest, ""); + linkage_flag = 0; + + j = 0; + bar_characters = 0; + separator_row = 0; + + memset(values, 0, sizeof(values)); + memset(set, ' ', sizeof(set)); + + if(length > 160) { + /* This only blocks rediculously long input - the actual length of the + resulting barcode depends on the type of data, so this is trapped later */ + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + for(i = 0; i < length; i++) { + if(source[i] == '\0') { + /* Null characters not allowed! */ + strcpy(symbol->errtxt, "NULL character in input data"); + return ERROR_INVALID_DATA; + } + } + + /* if part of a composite symbol make room for the separator pattern */ + if(symbol->symbology == BARCODE_EAN128_CC) { + separator_row = symbol->rows; + symbol->row_height[symbol->rows] = 1; + symbol->rows += 1; + } + + if(symbol->input_mode != GS1_MODE) { + /* GS1 data has not been checked yet */ + error_number = gs1_verify(symbol, source, length, reduced); + if(error_number != 0) { return error_number; } + } + + /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ + indexliste = 0; + indexchaine = 0; + + mode = parunmodd(reduced[indexchaine]); + if(reduced[indexchaine] == '[') { + mode = ABORC; + } + + for(i = 0; i < 170; i++) { + list[0][i] = 0; + } + + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(reduced[indexchaine]); + if(reduced[indexchaine] == '[') { mode = ABORC; } + } + indexliste++; + } while (indexchaine < strlen(reduced)); + + dxsmooth(&indexliste); + + /* Put set data into set[] */ + read = 0; + for(i = 0; i < indexliste; i++) { + for(j = 0; j < list[0][i]; j++) { + switch(list[1][i]) { + case SHIFTA: set[read] = 'a'; break; + case LATCHA: set[read] = 'A'; break; + case SHIFTB: set[read] = 'b'; break; + case LATCHB: set[read] = 'B'; break; + case LATCHC: set[read] = 'C'; break; + } + read++; + } + } + + /* Watch out for odd-length Mode C blocks */ + c_count = 0; + for(i = 0; i < read; i++) { + if(set[i] == 'C') { + if(reduced[i] == '[') { + if(c_count & 1) { + if((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } else { + c_count++; + } + } else { + if(c_count & 1) { + if((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } + } + if(c_count & 1) { + if((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + for(i = 1; i < read - 1; i++) { + if((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { + set[i] = 'B'; + } + } + + /* for(i = 0; i < read; i++) { + printf("char %c mode %c\n", reduced[i], set[i]); + } */ + + /* Now we can calculate how long the barcode is going to be - and stop it from + being too long */ + last_set = ' '; + glyph_count = 0.0; + for(i = 0; i < strlen(reduced); i++) { + if((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if(set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + + if((set[i] == 'C') && (reduced[i] != '[')) { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + if(glyph_count > 80.0) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + + /* So now we know what start character to use - we can get on with it! */ + switch(set[0]) + { + case 'A': /* Start A */ + concat(dest, C128Table[103]); + values[0] = 103; + break; + case 'B': /* Start B */ + concat(dest, C128Table[104]); + values[0] = 104; + break; + case 'C': /* Start C */ + concat(dest, C128Table[105]); + values[0] = 105; + break; + } + bar_characters++; + + concat(dest, C128Table[102]); + values[1] = 102; + bar_characters++; + + /* Encode the data */ + read = 0; + do { + + if((read != 0) && (set[read] != set[read - 1])) + { /* Latch different code set */ + switch(set[read]) + { + case 'A': concat(dest, C128Table[101]); + values[bar_characters] = 101; + bar_characters++; + break; + case 'B': concat(dest, C128Table[100]); + values[bar_characters] = 100; + bar_characters++; + break; + case 'C': concat(dest, C128Table[99]); + values[bar_characters] = 99; + bar_characters++; + break; + } + } + + if((set[read] == 'a') || (set[read] == 'b')) { + /* Insert shift character */ + concat(dest, C128Table[98]); + values[bar_characters] = 98; + bar_characters++; + } + + if(reduced[read] != '[') { + switch(set[read]) + { /* Encode data characters */ + case 'A': + case 'a': + c128_set_a(reduced[read], dest, values, &bar_characters); + read++; + break; + case 'B': + case 'b': + c128_set_b(reduced[read], dest, values, &bar_characters); + read++; + break; + case 'C': + c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters); + read += 2; + break; + } + } else { + concat(dest, C128Table[102]); + values[bar_characters] = 102; + bar_characters++; + read++; + } + } while (read < strlen(reduced)); + + /* "...note that the linkage flag is an extra code set character between + the last data character and the Symbol Check Character" (GS1 Specification) */ + + /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */ + + switch(symbol->option_1) { + case 1: + case 2: + /* CC-A or CC-B 2D component */ + switch(set[strlen(reduced) - 1]) { + case 'A': linkage_flag = 100; break; + case 'B': linkage_flag = 99; break; + case 'C': linkage_flag = 101; break; + } + break; + case 3: + /* CC-C 2D component */ + switch(set[strlen(reduced) - 1]) { + case 'A': linkage_flag = 99; break; + case 'B': linkage_flag = 101; break; + case 'C': linkage_flag = 100; break; + } + break; + } + + if(linkage_flag != 0) { + concat(dest, C128Table[linkage_flag]); + values[bar_characters] = linkage_flag; + bar_characters++; + } + + /*for(i = 0; i < bar_characters; i++) { + printf("[%d] ", values[i]); + } + printf("\n");*/ + + /* check digit calculation */ + total_sum = 0; + for(i = 0; i < bar_characters; i++) + { + if(i > 0) + { + values[i] *= i; + + } + total_sum += values[i]; + } + concat(dest, C128Table[total_sum%103]); + values[bar_characters] = total_sum % 103; + bar_characters++; + + /* Stop character */ + concat(dest, C128Table[106]); + values[bar_characters] = 106; + bar_characters++; + expand(symbol, dest); + + /* Add the separator pattern for composite symbols */ + if(symbol->symbology == BARCODE_EAN128_CC) { + for(i = 0; i < symbol->width; i++) { + if(!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + } + + for(i = 0; i < length; i++) { + if((source[i] != '[') && (source[i] != ']')) { + symbol->text[i] = source[i]; + } + if(source[i] == '[') { + symbol->text[i] = '('; + } + if(source[i] == ']') { + symbol->text[i] = ')'; + } + } + + return error_number; +} + +int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) +{ + /* Add check digit if encoding an NVE18 symbol */ + int error_number, zeroes, i, nve_check, total_sum, sourcelen; + unsigned char ean128_equiv[25]; + + memset(ean128_equiv, 0, 25); + sourcelen = length; + + if(sourcelen > 17) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + + error_number = is_sane(NEON, source, length); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + zeroes = 17 - sourcelen; + strcpy((char *)ean128_equiv, "[00]"); + memset(ean128_equiv + 4, '0', zeroes); + strcpy((char*)ean128_equiv + 4 + zeroes, (char*)source); + + total_sum = 0; + for(i = sourcelen - 1; i >= 0; i--) + { + total_sum += ctoi(source[i]); + + if(!(i & 1)) { + total_sum += 2 * ctoi(source[i]); + } + } + nve_check = 10 - total_sum % 10; + if(nve_check == 10) { nve_check = 0; } + ean128_equiv[21] = itoc(nve_check); + ean128_equiv[22] = '\0'; + + error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + + return error_number; +} + +int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) +{ + /* EAN-14 - A version of EAN-128 */ + int i, count, check_digit; + int error_number, zeroes; + unsigned char ean128_equiv[20]; + + if(length > 13) { + strcpy(symbol->errtxt, "Input wrong length"); + return ERROR_TOO_LONG; + } + + error_number = is_sane(NEON, source, length); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid character in data"); + return error_number; + } + + zeroes = 13 - length; + strcpy((char*)ean128_equiv, "[01]"); + memset(ean128_equiv + 4, '0', zeroes); + ustrcpy(ean128_equiv + 4 + zeroes, source); + + count = 0; + for (i = length - 1; i >= 0; i--) { + count += ctoi(source[i]); + + if (!(i & 1)) { + count += 2 * ctoi(source[i]); + } + } + check_digit = 10 - (count % 10); + if (check_digit == 10) { check_digit = 0; } + ean128_equiv[17] = itoc(check_digit); + ean128_equiv[18] = '\0'; + + error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + + return error_number; +} diff --git a/backend/common.c b/backend/common.c new file mode 100644 index 0000000..72cc3ca --- /dev/null +++ b/backend/common.c @@ -0,0 +1,386 @@ +/* common.c - Contains functions needed for a number of barcodes */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include "common.h" + +int ustrlen(const unsigned char data[]) { + /* Local replacement for strlen() with unsigned char strings */ + int i; + for (i=0;data[i];i++); + + return i; +} + +void ustrcpy(unsigned char target[],const unsigned char source[]) { + /* Local replacement for strcpy() with unsigned char strings */ + int i, len; + + len = ustrlen(source); + for(i = 0; i < len; i++) { + target[i] = source[i]; + } + target[i] = '\0'; +} + +void concat(char dest[],const char source[]) +{ /* Concatinates dest[] with the contents of source[], copying /0 as well */ + unsigned int i, j, n; + + j = strlen(dest); + n = strlen(source); + for(i = 0; i <= n; i++) { + dest[i + j] = source[i]; } +} + +void uconcat(unsigned char dest[], const unsigned char source[]) +{ /* Concatinates dest[] with the contents of source[], copying /0 as well */ + unsigned int i, j; + + j = ustrlen(dest); + for(i = 0; i <= ustrlen(source); i++) { + dest[i + j] = source[i]; } +} + + +int ctoi(char source) +{ /* Converts a character 0-9 to its equivalent integer value */ + if((source >= '0') && (source <= '9')) + return (source - '0'); + return(source - 'A' + 10); +} + +char itoc(int source) +{ /* Converts an integer value to its hexadecimal character */ + if ((source >= 0) && (source <= 9)) { + return ('0' + source); } + else { + return ('A' + (source - 10)); } +} + +void to_upper(unsigned char source[]) +{ /* Converts lower case characters to upper case in a string source[] */ + unsigned int i, src_len = ustrlen(source); + + for (i = 0; i < src_len; i++) { + if ((source[i] >= 'a') && (source[i] <= 'z')) { + source [i] = (source[i] - 'a') + 'A'; } + } +} + +int is_sane(char test_string[], unsigned char source[], int length) +{ /* Verifies that a string only uses valid characters */ + unsigned int i, j, latch; + unsigned int lt = strlen(test_string); + + for(i = 0; i < length; i++) { + latch = FALSE; + for(j = 0; j < lt; j++) { + if (source[i] == test_string[j]) { + latch = TRUE; + break; + } + } + if (!(latch)) { + return ERROR_INVALID_DATA; + } + } + + return 0; +} + +int posn(char set_string[], char data) +{ /* Returns the position of data in set_string */ + unsigned int i, n = strlen(set_string); + + for(i = 0; i < n; i++) { + if (data == set_string[i]) { return i; } } + return 0; +} + +void lookup(char set_string[],const char *table[], char data, char dest[]) +{ /* Replaces huge switch statements for looking up in tables */ + unsigned int i, n = strlen(set_string); + + for(i = 0; i < n; i++) { + if (data == set_string[i]) { concat(dest, table[i]); } } +} + +int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord) +{ + return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1; +#if 0 + switch(x_sub) { + case 0: if((symbol->encoded_data[y_coord][x_char] & 0x01) != 0) { result = 1; } break; + case 1: if((symbol->encoded_data[y_coord][x_char] & 0x02) != 0) { result = 1; } break; + case 2: if((symbol->encoded_data[y_coord][x_char] & 0x04) != 0) { result = 1; } break; + case 3: if((symbol->encoded_data[y_coord][x_char] & 0x08) != 0) { result = 1; } break; + case 4: if((symbol->encoded_data[y_coord][x_char] & 0x10) != 0) { result = 1; } break; + case 5: if((symbol->encoded_data[y_coord][x_char] & 0x20) != 0) { result = 1; } break; + case 6: if((symbol->encoded_data[y_coord][x_char] & 0x40) != 0) { result = 1; } break; + } + + return result; +#endif +} + +void set_module(struct zint_symbol *symbol, int y_coord, int x_coord) +{ + symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7); +#if 0 + int x_char, x_sub; + + + x_char = x_coord / 7; + x_sub = x_coord % 7; + + switch(x_sub) { + case 0: symbol->encoded_data[y_coord][x_char] += 0x01; break; + case 1: symbol->encoded_data[y_coord][x_char] += 0x02; break; + case 2: symbol->encoded_data[y_coord][x_char] += 0x04; break; + case 3: symbol->encoded_data[y_coord][x_char] += 0x08; break; + case 4: symbol->encoded_data[y_coord][x_char] += 0x10; break; + case 5: symbol->encoded_data[y_coord][x_char] += 0x20; break; + case 6: symbol->encoded_data[y_coord][x_char] += 0x40; break; + } /* The last binary digit is reserved for colour barcodes */ +#endif +} + +void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord) +{ + symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7)); +#if 0 + int x_char, x_sub; + + x_char = x_coord / 7; + x_sub = x_coord % 7; + + switch(x_sub) { + case 0: symbol->encoded_data[y_coord][x_char] -= 0x01; break; + case 1: symbol->encoded_data[y_coord][x_char] -= 0x02; break; + case 2: symbol->encoded_data[y_coord][x_char] -= 0x04; break; + case 3: symbol->encoded_data[y_coord][x_char] -= 0x08; break; + case 4: symbol->encoded_data[y_coord][x_char] -= 0x10; break; + case 5: symbol->encoded_data[y_coord][x_char] -= 0x20; break; + case 6: symbol->encoded_data[y_coord][x_char] -= 0x40; break; + } /* The last binary digit is reserved for colour barcodes */ +#endif +} + +void expand(struct zint_symbol *symbol, char data[]) +{ /* Expands from a width pattern to a bit pattern */ + + unsigned int reader, n = strlen(data); + int writer, i; + char latch; + + writer = 0; + latch = '1'; + + for(reader = 0; reader < n; reader++) { + for(i = 0; i < ctoi(data[reader]); i++) { + if(latch == '1') { set_module(symbol, symbol->rows, writer); } + writer++; + } + + latch = (latch == '1' ? '0' : '1'); + } + + if(symbol->symbology != BARCODE_PHARMA) { + if(writer > symbol->width) { + symbol->width = writer; + } + } else { + /* Pharmacode One ends with a space - adjust for this */ + if(writer > symbol->width + 2) { + symbol->width = writer - 2; + } + } + symbol->rows = symbol->rows + 1; +} + +int is_stackable(int symbology) { + /* Indicates which symbologies can have row binding */ + if(symbology < BARCODE_PDF417) { return 1; } + if(symbology == BARCODE_CODE128B) { return 1; } + if(symbology == BARCODE_ISBNX) { return 1; } + if(symbology == BARCODE_EAN14) { return 1; } + if(symbology == BARCODE_NVE18) { return 1; } + if(symbology == BARCODE_KOREAPOST) { return 1; } + if(symbology == BARCODE_PLESSEY) { return 1; } + if(symbology == BARCODE_TELEPEN_NUM) { return 1; } + if(symbology == BARCODE_ITF14) { return 1; } + if(symbology == BARCODE_CODE32) { return 1; } + + return 0; +} + +int is_extendable(int symbology) { + /* Indicates which symbols can have addon */ + if(symbology == BARCODE_EANX) { return 1; } + if(symbology == BARCODE_UPCA) { return 1; } + if(symbology == BARCODE_UPCE) { return 1; } + if(symbology == BARCODE_ISBNX) { return 1; } + if(symbology == BARCODE_UPCA_CC) { return 1; } + if(symbology == BARCODE_UPCE_CC) { return 1; } + if(symbology == BARCODE_EANX_CC) { return 1; } + + return 0; +} + +int roundup(float input) +{ + float remainder; + int integer_part; + + integer_part = (int)input; + remainder = input - integer_part; + + if(remainder > 0.1) { + integer_part++; + } + + return integer_part; +} + +int istwodigits(unsigned char source[], int position) +{ + if((source[position] >= '0') && (source[position] <= '9')) { + if((source[position + 1] >= '0') && (source[position + 1] <= '9')) { + return 1; + } + } + + return 0; +} + +float froundup(float input) +{ + float fraction, output = 0.0; + + fraction = input - (int)input; + if(fraction > 0.01) { output = (input - fraction) + 1.0; } else { output = input; } + + return output; +} + +int latin1_process(unsigned char source[], unsigned char preprocessed[], int *length) +{ + int j, i, next; + + /* Convert Unicode to Latin-1 for those symbologies which only support Latin-1 */ + j = 0; + i = 0; + if (length && *length) { + do { + next = -1; + if(source[i] < 128) { + preprocessed[j] = source[i]; + j++; + next = i + 1; + } else { + if(source[i] == 0xC2) { + preprocessed[j] = source[i + 1]; + j++; + next = i + 2; + } + if(source[i] == 0xC3) { + preprocessed[j] = source[i + 1] + 64; + j++; + next = i + 2; + } + } + if(next == -1) { + return ERROR_INVALID_DATA; + } + i = next; + } while(i < *length); + preprocessed[j] = '\0'; + *length = j; + } + + return 0; +} + +int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length) +{ + int bpos, jpos, error_number; + int next; + + bpos = 0; + jpos = 0; + error_number = 0; + next = 0; + + do { + if(source[bpos] <= 0x7f) { + /* 1 byte mode (7-bit ASCII) */ + vals[jpos] = source[bpos]; + next = bpos + 1; + jpos++; + } else { + if((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) { + strcpy(symbol->errtxt, "Corrupt Unicode data"); + return ERROR_INVALID_DATA; + } + if((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) { + strcpy(symbol->errtxt, "Overlong encoding not supported"); + return ERROR_INVALID_DATA; + } + + if((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) { + /* 2 byte mode */ + vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f); + next = bpos + 2; + jpos++; + } else + if((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) { + /* 3 byte mode */ + vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f); + next = bpos + 3; + jpos ++; + } else + if(source[bpos] >= 0xf0) { + strcpy(symbol->errtxt, "Unicode sequences of more than 3 bytes not supported"); + return ERROR_INVALID_DATA; + } + } + + bpos = next; + + } while(bpos < *length); + *length = jpos; + + return error_number; +} + diff --git a/backend/common.h b/backend/common.h new file mode 100644 index 0000000..d7fead9 --- /dev/null +++ b/backend/common.h @@ -0,0 +1,81 @@ +/* common.h - Header for all common functions in common.c */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +/* Used in some logic */ +#ifndef __COMMON_H +#define __COMMON_H + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +/* The most commonly used set */ +#define NEON "0123456789" + +#include "zint.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern int ustrlen(const unsigned char source[]); +extern void ustrcpy(unsigned char target[], const unsigned char source[]); +extern void concat(char dest[], const char source[]); +extern void uconcat(unsigned char dest[], const unsigned char source[]); +extern int ctoi(char source); +extern char itoc(int source); +extern void to_upper(unsigned char source[]); +extern int is_sane(char test_string[], unsigned char source[], int length); +extern void lookup(char set_string[],const char *table[], char data, char dest[]); +extern int posn(char set_string[], char data); +extern void expand(struct zint_symbol *symbol, char data[]); +extern int is_stackable(int symbology); +extern int is_extendable(int symbology); +extern int roundup(float input); +extern int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord); +extern void set_module(struct zint_symbol *symbol, int y_coord, int x_coord); +extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord); +extern int istwodigits(unsigned char source[], int position); +extern float froundup(float input); +extern int parunmodd(unsigned char llyth); +extern int latin1_process(unsigned char source[], unsigned char preprocessed[], int *length); +extern int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __COMMON_H */ diff --git a/backend/dllversion.c b/backend/dllversion.c new file mode 100644 index 0000000..50f1653 --- /dev/null +++ b/backend/dllversion.c @@ -0,0 +1,31 @@ +/* Sed: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/versions.asp */ +#if defined (_WIN32) && (defined(_USRDLL) || defined(DLL_EXPORT) || defined(PIC)) +#include <windows.h> +#include <shlwapi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +__declspec(dllexport) HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi); + +#ifdef __cplusplus +} +#endif + +HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi) +{ + if (!pdvi || (sizeof(*pdvi) != pdvi->info1.cbSize)) + return (E_INVALIDARG); + + pdvi->info1.dwMajorVersion = 2; + pdvi->info1.dwMinorVersion = 4; + pdvi->info1.dwBuildNumber = 2; + pdvi->info1.dwPlatformID = DLLVER_PLATFORM_WINDOWS; + if (sizeof(DLLVERSIONINFO2) == pdvi->info1.cbSize) + pdvi->ullVersion = MAKEDLLVERULL(2, 4, 2, 0); + + return S_OK; +} +#endif /* _WIN32 */ diff --git a/backend/font.h b/backend/font.h new file mode 100644 index 0000000..4ce6364 --- /dev/null +++ b/backend/font.h @@ -0,0 +1,1702 @@ +/* font.h - Font for PNG images */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +/* This file contains the pixel-by-pixel representation of the "Misc Fixed" font + at 10 point size processed by the Gimp */ + +static const int ascii_font[9310] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,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,1,0,0,0, + 0,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0, + 0,0,0,0,1,1,1,1,0,0,0,0,1,1,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,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1, + 0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0, + 1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0, + 0,0,0,0,1,0,0,0,0,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,1,0,0,0,1,1,0,0,0,0, + 0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1, + 1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1, + 1,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0, + 0,1,1,1,1,0,0,0,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,1,1,1,1,0,0,0,0,1,1,1,0,0,0, + 0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1, + 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1, + 1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0, + 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0, + 0,1,1,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, + 0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0, + 1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1, + 1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, + 1,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1, + 1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,1,0,0,0,0,0,0, + 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1, + 0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,0, + 1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,0,1,0,0,0,0,0,0,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,1,0,0,0,1,0,0,1,0,0,0, + 0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0, + 0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0, + 0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, + 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,1,0,0,0,0, + 0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0, + 1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0, + 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0, + 0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, + 1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0, + 0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 0,0,0,0,0,0,1,0,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,1,0,0,1,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,1, + 0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, + 0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,1, + 0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, + 0,1,0,0,0,0,0,0,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,1,0,0,1,0,0,0,0,1,0,0, + 1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0, + 0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,1,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,1,0,0,0, + 0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0, + 0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, + 0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,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,1,0,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,1,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,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1, + 1,1,1,0,1,0,0,1,0,1,0,0,1,1,1,0, + 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1, + 0,1,0,1,0,0,0,0,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,1,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, + 1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1, + 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0, + 1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1, + 0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0, + 0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, + 0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,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, + 1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1, + 0,0,0,0,1,0,0,0,0,0,1,1,1,0,1,0, + 1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0, + 0,0,1,1,0,1,0,0,0,1,0,0,0,0,0,1, + 0,0,0,0,1,1,0,1,0,0,1,0,1,1,1,0, + 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0, + 1,1,1,0,1,0,1,0,1,1,1,0,0,0,1,1, + 1,1,0,0,1,1,1,1,1,0,0,1,0,0,0,0, + 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1, + 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,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,1, + 0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, + 1,1,1,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1, + 1,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0, + 1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0, + 0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, + 0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, + 0,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,0, + 0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0, + 1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0, + 0,0,0,1,0,1,1,0,1,0,1,0,1,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1, + 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0, + 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, + 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0, + 1,0,1,1,1,1,1,0,0,1,0,0,0,1,0,0, + 1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1, + 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1, + 0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,0, + 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0, + 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,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,1, + 0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0, + 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, + 0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0, + 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0, + 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0, + 0,1,0,0,1,0,0,0,1,1,1,0,1,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,0,0,0,1, + 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, + 1,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,1,1,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1, + 0,1,0,0,0,0,1,0,1,1,1,1,1,0,0,1, + 0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0, + 1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0, + 0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0, + 0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0, + 1,0,0,1,0,0,0,1,0,0,1,0,1,0,1,0, + 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0, + 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,0,1,0,0,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,1,1, + 1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1, + 0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, + 1,1,1,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, + 0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0, + 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, + 1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0, + 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0, + 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,0,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, + 1,1,1,1,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1, + 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1, + 1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0, + 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0, + 0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0, + 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,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,1, + 0,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0, + 1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1, + 0,1,0,1,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,1,1,1,1,1,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, + 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0, + 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, + 0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,0, + 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0, + 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0, + 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0, + 0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0, + 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,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,1, + 0,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0, + 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, + 0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0, + 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0, + 1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0, + 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0, + 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, + 0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0, + 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, + 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0, + 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1, + 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1, + 0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0, + 0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1, + 1,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0, + 1,0,0,0,0,1,0,0,1,1,1,0,1,0,0,1, + 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,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,1, + 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1, + 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,0,0,0,1,0,0,0,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,1,1,1,0, + 0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0, + 1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1, + 1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,1, + 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0, + 0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0, + 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,1, + 0,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1, + 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1, + 1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0, + 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1, + 1,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1, + 1,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1, + 0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0, + 1,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1, + 1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1, + 0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1, + 1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,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, + 1,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1, + 0,0,0,0,1,0,0,0,0,1,0,1,1,1,0,0, + 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1, + 0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,1, + 1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1, + 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0, + 1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1, + 1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0, + 1,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0, + 1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1, + 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,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,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,1,0,0,0,0,1,0,0,0,0,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,1,0,0, + 0,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,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,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,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,1,0,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,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,1,0,0,1,0,0,0,0,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,0,0,0, + 0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0, + 0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, + 0,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,1,1,1,1,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1, + 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0 +}; + +static const int ascii_ext_font[9310] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1, + 0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0, + 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0, + 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, + 0,1,0,0,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, + 0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0, + 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,1,1,1,1,0, + 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1, + 1,0,0,0,0,0,0,0,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,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,1,0,0,0,0, + 0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0, + 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, + 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1, + 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1, + 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0, + 1,0,0,0,0,0,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,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,1,0,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,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,1,0,0,0, + 1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, + 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1, + 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, + 0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0, + 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0, + 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0, + 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,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,1,0,0,1, + 0,0,0,0,1,1,1,1,0,0,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,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,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,1,0,0,0,0,0, + 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0, + 0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1, + 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1, + 0,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,1,0,0,0,0,0, + 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, + 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0, + 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0, + 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,1,0,0,0,0,0,0, + 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,1,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, + 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1, + 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0, + 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,1,1,1,1,0,1, + 0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, + 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, + 0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0, + 0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1, + 0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0, + 0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1, + 1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0, + 0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0, + 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, + 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1, + 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, + 0,0,1,1,1,1,1,0,0,1,0,0,0,1,0,1, + 1,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, + 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, + 1,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0, + 0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0, + 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, + 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1, + 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1, + 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1, + 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0, + 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1, + 0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0, + 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1, + 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, + 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, + 1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, + 0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0, + 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, + 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1, + 0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, + 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, + 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,0, + 0,0,1,0,0,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,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,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,1,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, + 0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0, + 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1, + 0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, + 1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0, + 1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, + 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1, + 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, + 0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0, + 1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, + 0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0, + 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, + 1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1, + 0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0, + 0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,1, + 0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, + 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, + 0,1,1,1,1,0,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,1,0,0,0,0,1,0,1,0,1,1,1,0, + 0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1, + 0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1, + 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0, + 1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,1,0,1,0,1,0,0,0,0,1,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,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0, + 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,1,1,1,1,0,0,1,1, + 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, + 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, + 0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, + 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, + 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,1,0,0,0,0,1,0,1,1,0,0,0,1, + 0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,1, + 1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0, + 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0, + 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, + 0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1, + 1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,0, + 0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1, + 0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1, + 1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1, + 1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1, + 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, + 1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1, + 1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, + 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1, + 0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0, + 0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0, + 1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1, + 1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0, + 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1, + 0,0,1,0,0,0,1,0,0, + 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1, + 1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0, + 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1, + 1,1,1,1,0,1,0,1,0,0,0,0,0,1,1,1, + 1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 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,1,0,0,0, + 1,0,0,0,0,1,0,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,1,0,1,0,0,0,1,0, + 1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,1, + 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, + 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0, + 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1, + 0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,0, + 1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,1, + 0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0, + 1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0, + 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, + 1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, + 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1, + 0,0,1,0,0,1,0,0,0, + 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0, + 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1, + 0,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,0,0,1,0,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,1,0,1,0,0,0,1,0,1, + 0,1,0,0,1,0,0,0,1,0,0,1,0,1,0,1, + 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, + 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0, + 0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,0, + 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, + 0,0,0,1,0,1,0,0,0, + 0,0,1,0,0,0,1,0,1,0,0,1,0,0,1,1, + 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, + 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1, + 0,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,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1, + 1,0,0,0,0,1,0,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,1,0,1,0,0,0,1,0,0,1, + 1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,1, + 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, + 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, + 1,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, + 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,1, + 0,0,0,1,1,0,1,0,0,0,1,1,0,1,0,0, + 0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,1, + 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0, + 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, + 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, + 1,1,0,0,0,1,0,1,0,0,0,1,1,0,1,0, + 0,0,1,1,0,1,0,0,0,1,1,0,1,0,0,0, + 1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1, + 0,0,0,1,1,1,0,0,0, + 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, + 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0, + 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 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,1,0,1,0, + 1,0,0,0,0,1,0,1,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,0,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,1, + 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, + 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, + 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, + 1,0,1,0,0,1,1,1,0,0,1,1,1,1,0,0, + 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, + 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1, + 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, + 0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,1, + 0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, + 0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,1, + 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, + 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1, + 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0, + 0,1,1,1,1,1,0,0,0,1,1,1,0,1,0,0, + 1,1,1,0,1,0,0,1,1,1,0,1,0,0,1,1, + 1,0,1,0,0,1,1,1,0,1,0,0,1,1,1,0, + 1,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0, + 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, + 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1, + 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, + 0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1, + 0,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1, + 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, + 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0, + 0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,1, + 1,1,0,1,0,0,1,1,1,0,1,0,0,1,1,1, + 0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0, + 0,0,0,0,1,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,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 0,0,0,0,0,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,0,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,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, + 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,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, + 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,1,0,0,1,0,0,0,1,0,0,0,0,0, + 0,1,0,0,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,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,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0, + 0,0,1,1,0,0,0,0,0 +}; + +static const int small_font[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,0,1,0,0,0,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,1,0,0, + 0,0,1,0,0,0,1,1,0,0,1,1,1,1,0,0, + 0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1, + 1,1,0,0,1,1,0,0,0,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,1,0,0,0,1,1,0,0, + 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,1, + 1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1, + 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0, + 1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1, + 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0, + 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0, + 1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0, + 0,1,0,1,0,0,1,0,0,1,0,1,0,1,1,1, + 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1, + 0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, + 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, + 1,0,1,0,0,0,0,0,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, + 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,1,0,0,0,1,0,0,0,1,0,0, + 0,0,1,0,1,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0, + 1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0, + 1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0, + 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0, + 0,1,1,0,0,1,0,0,1,0,0,0,0,1,0,0, + 1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0, + 0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,1, + 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, + 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, + 1,0,1,0,1,0,0,1,0,0,0,0,1,1,1,1, + 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0, + 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0, + 0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0, + 1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1, + 0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0, + 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,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, + 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,1,0,0,0,0,1,0,0,0,0,1,0, + 0,1,0,1,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1, + 0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0, + 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0, + 0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1, + 0,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0, + 1,0,0,0,1,1,0,0,1,0,0,1,0,0,1,1, + 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1, + 0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0, + 1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,1, + 0,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0, + 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0, + 1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1, + 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0, + 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0, + 0,1,0,0,1,1,0,0,0,1,0,1,0,0,0,1, + 0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0, + 1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,1, + 1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0, + 1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0, + 0,1,1,1,0,0,0,1,1,0,0,1,1,1,0,0, + 0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,1, + 1,1,0,0,1,0,0,1,0,0,1,0,1,0,1,0, + 0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,1, + 1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0, + 1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1, + 1,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1, + 0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0, + 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1, + 1,1,1,0,0,0,0,1,0,1,0,0,1,0,0,0, + 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,1,0,0,1,0,1,1,0, + 1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1, + 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, + 1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, + 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1, + 0,1,0,1,1,0,1,0,0,1,0,1,1,1,0,0, + 1,0,0,1,0,1,1,1,0,0,0,0,1,0,0,0, + 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1, + 1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0, + 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, + 0,0,1,0,1,0,1,1,0,1,1,1,0,0,1,0, + 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, + 1,0,1,1,0,0,0,0,0,1,0,0,1,1,1,1, + 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0, + 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0, + 0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,1, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0, + 0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0, + 0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,0, + 0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0, + 0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1, + 0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,1, + 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1, + 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, + 0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0, + 1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,1, + 0,1,0,1,1,0,1,0,0,1,0,1,0,0,0,0, + 1,1,0,1,0,1,0,1,0,0,1,0,0,1,0,0, + 0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1, + 1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0, + 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,1,1,0,1,0,0,1,0,1,0,0,0,0,1, + 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,1, + 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, + 1,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1, + 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0, + 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,1, + 1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0, + 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0, + 1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0, + 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, + 1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, + 0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0, + 0,1,1,1,0,1,1,1,1,0,0,1,1,0,0,0, + 0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, + 0,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1, + 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0, + 1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1, + 1,1,0,0,1,1,1,1,0,1,0,0,0,0,0,1, + 1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,1, + 0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1, + 0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0, + 0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,0, + 0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0, + 0,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1, + 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1, + 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0, + 0,1,0,1,0,1,1,1,0,0,0,1,1,0,0,0, + 1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0, + 0,0,0,1,0,0,1,0,0,1,1,1,0,0,1,0, + 1,0,1,0,0,1,0,0,1,1,1,0,1,0,0,1, + 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0, + 0,1,1,1,0,1,0,0,0,0,1,1,1,0,0,0, + 0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1, + 1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1, + 1,0,0,0,0,1,0,0,0,1,0,0,0,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,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,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,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,1, + 1,1,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,0,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, + 0,0,0,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,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 +}; + +static const int small_font_extended[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, + 1,1,0,0,1,0,1,0,0,1,1,1,0,0,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0, + 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0, + 0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, + 0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0, + 0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1, + 0,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1, + 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1, + 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1, + 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0, + 1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0, + 1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0, + 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, + 0,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, + 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0, + 0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0, + 0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0, + 1,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, + 0,0,0,1,1,0,0,0,1,0,1,0,0,0,1,0, + 0,0,0,0,0,0,0,1,0,1,0, + 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1, + 0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1, + 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0, + 0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0, + 1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, + 0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1, + 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, + 0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0, + 1,1,0,0,0,1,1,0,0,1,0,1,0,0,1,0, + 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,0, + 0,0,0,1,0,1,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1, + 0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0, + 0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0, + 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1, + 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0, + 0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0, + 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, + 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1, + 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,1,1,0,0,1,0,0,0,0, + 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1, + 1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1, + 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, + 0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0, + 1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0, + 0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1, + 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,1,1,0,1,0, + 0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1, + 0,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0, + 1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0, + 0,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, + 0,1,0,0,1,0,1,0,1,0,0,0,1,1,1,0, + 0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0, + 1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0, + 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1, + 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0, + 0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0, + 1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0, + 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0, + 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1, + 0,1,1,1,0,0,1,0,0,1,0, + 0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0, + 1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,1, + 0,1,0,0,0,0,0,0,1,1,0,0,1,0,0,0, + 0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0, + 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0, + 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1, + 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, + 0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,1, + 0,1,1,0,1,0,0,1,0,0,0,1,1,1,1,0, + 1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1, + 1,1,1,0,1,1,1,1,0,1,1,1,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, + 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1, + 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0, + 0,1,1,1,0,0,1,0,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1, + 0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,1, + 1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1, + 1,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1, + 0,1,0,0,1,0,1,0,0,1,0, + 0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0, + 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0, + 1,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0, + 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, + 0,1,1,0,0,1,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,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,1, + 0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0, + 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0, + 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, + 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1, + 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0, + 0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,0, + 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1, + 0,1,1,0,1,0,1,1,0,1,0,1,0,0,0,1, + 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0, + 0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0, + 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0, + 0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, + 0,1,0,0,1,0,0,1,0,1,0, + 0,0,1,0,0,0,1,1,1,0,1,0,1,1,0,1, + 0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0, + 0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0, + 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0, + 0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,0, + 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, + 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1, + 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1, + 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1, + 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0, + 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0, + 1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0, + 0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,1, + 0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0, + 0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0, + 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0, + 1,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0, + 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1, + 0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1, + 0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,0, + 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0, + 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, + 1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1, + 1,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0, + 0,1,1,1,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 1,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,1,0,0,0,1,1, + 0,0,0,0,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,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, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,1,0,0,0,0,0,1,0,0,0 +}; diff --git a/backend/gb2312.h b/backend/gb2312.h new file mode 100644 index 0000000..572ff3b --- /dev/null +++ b/backend/gb2312.h @@ -0,0 +1,7478 @@ +/* gb2312.h - Unicode to GB 2312-1980 lookup table + + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +static const unsigned long int gb2312_lookup[] = { + 0x00A4, 0xA1E8, + 0x00A7, 0xA1EC, + 0x00A8, 0xA1A7, + 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, + 0x00B7, 0xA1A4, + 0x00D7, 0xA1C1, + 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, + 0x00E8, 0xA8A8, + 0x00E9, 0xA8A6, + 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, + 0x00ED, 0xA8AA, + 0x00F2, 0xA8B0, + 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, + 0x00F9, 0xA8B4, + 0x00FA, 0xA8B2, + 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, + 0x0113, 0xA8A5, + 0x011B, 0xA8A7, + 0x012B, 0xA8A9, + 0x014D, 0xA8AD, + 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, + 0x01D0, 0xA8AB, + 0x01D2, 0xA8AF, + 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, + 0x01D8, 0xA8B6, + 0x01DA, 0xA8B7, + 0x01DC, 0xA8B8, + 0x02C7, 0xA1A6, + 0x02C9, 0xA1A5, + 0x0391, 0xA6A1, + 0x0392, 0xA6A2, + 0x0393, 0xA6A3, + 0x0394, 0xA6A4, + 0x0395, 0xA6A5, + 0x0396, 0xA6A6, + 0x0397, 0xA6A7, + 0x0398, 0xA6A8, + 0x0399, 0xA6A9, + 0x039A, 0xA6AA, + 0x039B, 0xA6AB, + 0x039C, 0xA6AC, + 0x039D, 0xA6AD, + 0x039E, 0xA6AE, + 0x039F, 0xA6AF, + 0x03A0, 0xA6B0, + 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, + 0x03A4, 0xA6B3, + 0x03A5, 0xA6B4, + 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, + 0x03A8, 0xA6B7, + 0x03A9, 0xA6B8, + 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, + 0x03B3, 0xA6C3, + 0x03B4, 0xA6C4, + 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, + 0x03B7, 0xA6C7, + 0x03B8, 0xA6C8, + 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, + 0x03BB, 0xA6CB, + 0x03BC, 0xA6CC, + 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, + 0x03BF, 0xA6CF, + 0x03C0, 0xA6D0, + 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, + 0x03C4, 0xA6D3, + 0x03C5, 0xA6D4, + 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, + 0x03C8, 0xA6D7, + 0x03C9, 0xA6D8, + 0x0401, 0xA7A7, + 0x0410, 0xA7A1, + 0x0411, 0xA7A2, + 0x0412, 0xA7A3, + 0x0413, 0xA7A4, + 0x0414, 0xA7A5, + 0x0415, 0xA7A6, + 0x0416, 0xA7A8, + 0x0417, 0xA7A9, + 0x0418, 0xA7AA, + 0x0419, 0xA7AB, + 0x041A, 0xA7AC, + 0x041B, 0xA7AD, + 0x041C, 0xA7AE, + 0x041D, 0xA7AF, + 0x041E, 0xA7B0, + 0x041F, 0xA7B1, + 0x0420, 0xA7B2, + 0x0421, 0xA7B3, + 0x0422, 0xA7B4, + 0x0423, 0xA7B5, + 0x0424, 0xA7B6, + 0x0425, 0xA7B7, + 0x0426, 0xA7B8, + 0x0427, 0xA7B9, + 0x0428, 0xA7BA, + 0x0429, 0xA7BB, + 0x042A, 0xA7BC, + 0x042B, 0xA7BD, + 0x042C, 0xA7BE, + 0x042D, 0xA7BF, + 0x042E, 0xA7C0, + 0x042F, 0xA7C1, + 0x0430, 0xA7D1, + 0x0431, 0xA7D2, + 0x0432, 0xA7D3, + 0x0433, 0xA7D4, + 0x0434, 0xA7D5, + 0x0435, 0xA7D6, + 0x0436, 0xA7D8, + 0x0437, 0xA7D9, + 0x0438, 0xA7DA, + 0x0439, 0xA7DB, + 0x043A, 0xA7DC, + 0x043B, 0xA7DD, + 0x043C, 0xA7DE, + 0x043D, 0xA7DF, + 0x043E, 0xA7E0, + 0x043F, 0xA7E1, + 0x0440, 0xA7E2, + 0x0441, 0xA7E3, + 0x0442, 0xA7E4, + 0x0443, 0xA7E5, + 0x0444, 0xA7E6, + 0x0445, 0xA7E7, + 0x0446, 0xA7E8, + 0x0447, 0xA7E9, + 0x0448, 0xA7EA, + 0x0449, 0xA7EB, + 0x044A, 0xA7EC, + 0x044B, 0xA7ED, + 0x044C, 0xA7EE, + 0x044D, 0xA7EF, + 0x044E, 0xA7F0, + 0x044F, 0xA7F1, + 0x0451, 0xA7D7, + 0x2014, 0xA1AA, + 0x2016, 0xA1AC, + 0x2018, 0xA1AE, + 0x2019, 0xA1AF, + 0x201C, 0xA1B0, + 0x201D, 0xA1B1, + 0x2026, 0xA1AD, + 0x2030, 0xA1EB, + 0x2032, 0xA1E4, + 0x2033, 0xA1E5, + 0x203B, 0xA1F9, + 0x2103, 0xA1E6, + 0x2116, 0xA1ED, + 0x2160, 0xA2F1, + 0x2161, 0xA2F2, + 0x2162, 0xA2F3, + 0x2163, 0xA2F4, + 0x2164, 0xA2F5, + 0x2165, 0xA2F6, + 0x2166, 0xA2F7, + 0x2167, 0xA2F8, + 0x2168, 0xA2F9, + 0x2169, 0xA2FA, + 0x216A, 0xA2FB, + 0x216B, 0xA2FC, + 0x2190, 0xA1FB, + 0x2191, 0xA1FC, + 0x2192, 0xA1FA, + 0x2193, 0xA1FD, + 0x2208, 0xA1CA, + 0x220F, 0xA1C7, + 0x2211, 0xA1C6, + 0x221A, 0xA1CC, + 0x221D, 0xA1D8, + 0x221E, 0xA1DE, + 0x2220, 0xA1CF, + 0x2225, 0xA1CE, + 0x2227, 0xA1C4, + 0x2228, 0xA1C5, + 0x2229, 0xA1C9, + 0x222A, 0xA1C8, + 0x222B, 0xA1D2, + 0x222E, 0xA1D3, + 0x2234, 0xA1E0, + 0x2235, 0xA1DF, + 0x2236, 0xA1C3, + 0x2237, 0xA1CB, + 0x223D, 0xA1D7, + 0x2248, 0xA1D6, + 0x224C, 0xA1D5, + 0x2260, 0xA1D9, + 0x2261, 0xA1D4, + 0x2264, 0xA1DC, + 0x2265, 0xA1DD, + 0x226E, 0xA1DA, + 0x226F, 0xA1DB, + 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, + 0x2312, 0xA1D0, + 0x2460, 0xA2D9, + 0x2461, 0xA2DA, + 0x2462, 0xA2DB, + 0x2463, 0xA2DC, + 0x2464, 0xA2DD, + 0x2465, 0xA2DE, + 0x2466, 0xA2DF, + 0x2467, 0xA2E0, + 0x2468, 0xA2E1, + 0x2469, 0xA2E2, + 0x2474, 0xA2C5, + 0x2475, 0xA2C6, + 0x2476, 0xA2C7, + 0x2477, 0xA2C8, + 0x2478, 0xA2C9, + 0x2479, 0xA2CA, + 0x247A, 0xA2CB, + 0x247B, 0xA2CC, + 0x247C, 0xA2CD, + 0x247D, 0xA2CE, + 0x247E, 0xA2CF, + 0x247F, 0xA2D0, + 0x2480, 0xA2D1, + 0x2481, 0xA2D2, + 0x2482, 0xA2D3, + 0x2483, 0xA2D4, + 0x2484, 0xA2D5, + 0x2485, 0xA2D6, + 0x2486, 0xA2D7, + 0x2487, 0xA2D8, + 0x2488, 0xA2B1, + 0x2489, 0xA2B2, + 0x248A, 0xA2B3, + 0x248B, 0xA2B4, + 0x248C, 0xA2B5, + 0x248D, 0xA2B6, + 0x248E, 0xA2B7, + 0x248F, 0xA2B8, + 0x2490, 0xA2B9, + 0x2491, 0xA2BA, + 0x2492, 0xA2BB, + 0x2493, 0xA2BC, + 0x2494, 0xA2BD, + 0x2495, 0xA2BE, + 0x2496, 0xA2BF, + 0x2497, 0xA2C0, + 0x2498, 0xA2C1, + 0x2499, 0xA2C2, + 0x249A, 0xA2C3, + 0x249B, 0xA2C4, + 0x2500, 0xA9A4, + 0x2501, 0xA9A5, + 0x2502, 0xA9A6, + 0x2503, 0xA9A7, + 0x2504, 0xA9A8, + 0x2505, 0xA9A9, + 0x2506, 0xA9AA, + 0x2507, 0xA9AB, + 0x2508, 0xA9AC, + 0x2509, 0xA9AD, + 0x250A, 0xA9AE, + 0x250B, 0xA9AF, + 0x250C, 0xA9B0, + 0x250D, 0xA9B1, + 0x250E, 0xA9B2, + 0x250F, 0xA9B3, + 0x2510, 0xA9B4, + 0x2511, 0xA9B5, + 0x2512, 0xA9B6, + 0x2513, 0xA9B7, + 0x2514, 0xA9B8, + 0x2515, 0xA9B9, + 0x2516, 0xA9BA, + 0x2517, 0xA9BB, + 0x2518, 0xA9BC, + 0x2519, 0xA9BD, + 0x251A, 0xA9BE, + 0x251B, 0xA9BF, + 0x251C, 0xA9C0, + 0x251D, 0xA9C1, + 0x251E, 0xA9C2, + 0x251F, 0xA9C3, + 0x2520, 0xA9C4, + 0x2521, 0xA9C5, + 0x2522, 0xA9C6, + 0x2523, 0xA9C7, + 0x2524, 0xA9C8, + 0x2525, 0xA9C9, + 0x2526, 0xA9CA, + 0x2527, 0xA9CB, + 0x2528, 0xA9CC, + 0x2529, 0xA9CD, + 0x252A, 0xA9CE, + 0x252B, 0xA9CF, + 0x252C, 0xA9D0, + 0x252D, 0xA9D1, + 0x252E, 0xA9D2, + 0x252F, 0xA9D3, + 0x2530, 0xA9D4, + 0x2531, 0xA9D5, + 0x2532, 0xA9D6, + 0x2533, 0xA9D7, + 0x2534, 0xA9D8, + 0x2535, 0xA9D9, + 0x2536, 0xA9DA, + 0x2537, 0xA9DB, + 0x2538, 0xA9DC, + 0x2539, 0xA9DD, + 0x253A, 0xA9DE, + 0x253B, 0xA9DF, + 0x253C, 0xA9E0, + 0x253D, 0xA9E1, + 0x253E, 0xA9E2, + 0x253F, 0xA9E3, + 0x2540, 0xA9E4, + 0x2541, 0xA9E5, + 0x2542, 0xA9E6, + 0x2543, 0xA9E7, + 0x2544, 0xA9E8, + 0x2545, 0xA9E9, + 0x2546, 0xA9EA, + 0x2547, 0xA9EB, + 0x2548, 0xA9EC, + 0x2549, 0xA9ED, + 0x254A, 0xA9EE, + 0x254B, 0xA9EF, + 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, + 0x25B2, 0xA1F8, + 0x25B3, 0xA1F7, + 0x25C6, 0xA1F4, + 0x25C7, 0xA1F3, + 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, + 0x25CF, 0xA1F1, + 0x2605, 0xA1EF, + 0x2606, 0xA1EE, + 0x2640, 0xA1E2, + 0x2642, 0xA1E1, + 0x3000, 0xA1A1, + 0x3001, 0xA1A2, + 0x3002, 0xA1A3, + 0x3003, 0xA1A8, + 0x3005, 0xA1A9, + 0x3008, 0xA1B4, + 0x3009, 0xA1B5, + 0x300A, 0xA1B6, + 0x300B, 0xA1B7, + 0x300C, 0xA1B8, + 0x300D, 0xA1B9, + 0x300E, 0xA1BA, + 0x300F, 0xA1BB, + 0x3010, 0xA1BE, + 0x3011, 0xA1BF, + 0x3013, 0xA1FE, + 0x3014, 0xA1B2, + 0x3015, 0xA1B3, + 0x3016, 0xA1BC, + 0x3017, 0xA1BD, + 0x3041, 0xA4A1, + 0x3042, 0xA4A2, + 0x3043, 0xA4A3, + 0x3044, 0xA4A4, + 0x3045, 0xA4A5, + 0x3046, 0xA4A6, + 0x3047, 0xA4A7, + 0x3048, 0xA4A8, + 0x3049, 0xA4A9, + 0x304A, 0xA4AA, + 0x304B, 0xA4AB, + 0x304C, 0xA4AC, + 0x304D, 0xA4AD, + 0x304E, 0xA4AE, + 0x304F, 0xA4AF, + 0x3050, 0xA4B0, + 0x3051, 0xA4B1, + 0x3052, 0xA4B2, + 0x3053, 0xA4B3, + 0x3054, 0xA4B4, + 0x3055, 0xA4B5, + 0x3056, 0xA4B6, + 0x3057, 0xA4B7, + 0x3058, 0xA4B8, + 0x3059, 0xA4B9, + 0x305A, 0xA4BA, + 0x305B, 0xA4BB, + 0x305C, 0xA4BC, + 0x305D, 0xA4BD, + 0x305E, 0xA4BE, + 0x305F, 0xA4BF, + 0x3060, 0xA4C0, + 0x3061, 0xA4C1, + 0x3062, 0xA4C2, + 0x3063, 0xA4C3, + 0x3064, 0xA4C4, + 0x3065, 0xA4C5, + 0x3066, 0xA4C6, + 0x3067, 0xA4C7, + 0x3068, 0xA4C8, + 0x3069, 0xA4C9, + 0x306A, 0xA4CA, + 0x306B, 0xA4CB, + 0x306C, 0xA4CC, + 0x306D, 0xA4CD, + 0x306E, 0xA4CE, + 0x306F, 0xA4CF, + 0x3070, 0xA4D0, + 0x3071, 0xA4D1, + 0x3072, 0xA4D2, + 0x3073, 0xA4D3, + 0x3074, 0xA4D4, + 0x3075, 0xA4D5, + 0x3076, 0xA4D6, + 0x3077, 0xA4D7, + 0x3078, 0xA4D8, + 0x3079, 0xA4D9, + 0x307A, 0xA4DA, + 0x307B, 0xA4DB, + 0x307C, 0xA4DC, + 0x307D, 0xA4DD, + 0x307E, 0xA4DE, + 0x307F, 0xA4DF, + 0x3080, 0xA4E0, + 0x3081, 0xA4E1, + 0x3082, 0xA4E2, + 0x3083, 0xA4E3, + 0x3084, 0xA4E4, + 0x3085, 0xA4E5, + 0x3086, 0xA4E6, + 0x3087, 0xA4E7, + 0x3088, 0xA4E8, + 0x3089, 0xA4E9, + 0x308A, 0xA4EA, + 0x308B, 0xA4EB, + 0x308C, 0xA4EC, + 0x308D, 0xA4ED, + 0x308E, 0xA4EE, + 0x308F, 0xA4EF, + 0x3090, 0xA4F0, + 0x3091, 0xA4F1, + 0x3092, 0xA4F2, + 0x3093, 0xA4F3, + 0x30A1, 0xA5A1, + 0x30A2, 0xA5A2, + 0x30A3, 0xA5A3, + 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, + 0x30A6, 0xA5A6, + 0x30A7, 0xA5A7, + 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, + 0x30AA, 0xA5AA, + 0x30AB, 0xA5AB, + 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, + 0x30AE, 0xA5AE, + 0x30AF, 0xA5AF, + 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, + 0x30B2, 0xA5B2, + 0x30B3, 0xA5B3, + 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, + 0x30B6, 0xA5B6, + 0x30B7, 0xA5B7, + 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, + 0x30BA, 0xA5BA, + 0x30BB, 0xA5BB, + 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, + 0x30BE, 0xA5BE, + 0x30BF, 0xA5BF, + 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, + 0x30C2, 0xA5C2, + 0x30C3, 0xA5C3, + 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, + 0x30C6, 0xA5C6, + 0x30C7, 0xA5C7, + 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, + 0x30CA, 0xA5CA, + 0x30CB, 0xA5CB, + 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, + 0x30CE, 0xA5CE, + 0x30CF, 0xA5CF, + 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, + 0x30D2, 0xA5D2, + 0x30D3, 0xA5D3, + 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, + 0x30D6, 0xA5D6, + 0x30D7, 0xA5D7, + 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, + 0x30DA, 0xA5DA, + 0x30DB, 0xA5DB, + 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, + 0x30DE, 0xA5DE, + 0x30DF, 0xA5DF, + 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, + 0x30E2, 0xA5E2, + 0x30E3, 0xA5E3, + 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, + 0x30E6, 0xA5E6, + 0x30E7, 0xA5E7, + 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, + 0x30EA, 0xA5EA, + 0x30EB, 0xA5EB, + 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, + 0x30EE, 0xA5EE, + 0x30EF, 0xA5EF, + 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, + 0x30F2, 0xA5F2, + 0x30F3, 0xA5F3, + 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, + 0x30F6, 0xA5F6, + 0x3105, 0xA8C5, + 0x3106, 0xA8C6, + 0x3107, 0xA8C7, + 0x3108, 0xA8C8, + 0x3109, 0xA8C9, + 0x310A, 0xA8CA, + 0x310B, 0xA8CB, + 0x310C, 0xA8CC, + 0x310D, 0xA8CD, + 0x310E, 0xA8CE, + 0x310F, 0xA8CF, + 0x3110, 0xA8D0, + 0x3111, 0xA8D1, + 0x3112, 0xA8D2, + 0x3113, 0xA8D3, + 0x3114, 0xA8D4, + 0x3115, 0xA8D5, + 0x3116, 0xA8D6, + 0x3117, 0xA8D7, + 0x3118, 0xA8D8, + 0x3119, 0xA8D9, + 0x311A, 0xA8DA, + 0x311B, 0xA8DB, + 0x311C, 0xA8DC, + 0x311D, 0xA8DD, + 0x311E, 0xA8DE, + 0x311F, 0xA8DF, + 0x3120, 0xA8E0, + 0x3121, 0xA8E1, + 0x3122, 0xA8E2, + 0x3123, 0xA8E3, + 0x3124, 0xA8E4, + 0x3125, 0xA8E5, + 0x3126, 0xA8E6, + 0x3127, 0xA8E7, + 0x3128, 0xA8E8, + 0x3129, 0xA8E9, + 0x3220, 0xA2E5, + 0x3221, 0xA2E6, + 0x3222, 0xA2E7, + 0x3223, 0xA2E8, + 0x3224, 0xA2E9, + 0x3225, 0xA2EA, + 0x3226, 0xA2EB, + 0x3227, 0xA2EC, + 0x3228, 0xA2ED, + 0x3229, 0xA2EE, + 0x4E00, 0xD2BB, + 0x4E01, 0xB6A1, + 0x4E03, 0xC6DF, + 0x4E07, 0xCDF2, + 0x4E08, 0xD5C9, + 0x4E09, 0xC8FD, + 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, + 0x4E0C, 0xD8A2, + 0x4E0D, 0xB2BB, + 0x4E0E, 0xD3EB, + 0x4E10, 0xD8A4, + 0x4E11, 0xB3F3, + 0x4E13, 0xD7A8, + 0x4E14, 0xC7D2, + 0x4E15, 0xD8A7, + 0x4E16, 0xCAC0, + 0x4E18, 0xC7F0, + 0x4E19, 0xB1FB, + 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, + 0x4E1C, 0xB6AB, + 0x4E1D, 0xCBBF, + 0x4E1E, 0xD8A9, + 0x4E22, 0xB6AA, + 0x4E24, 0xC1BD, + 0x4E25, 0xD1CF, + 0x4E27, 0xC9A5, + 0x4E28, 0xD8AD, + 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, + 0x4E2C, 0xE3DC, + 0x4E2D, 0xD6D0, + 0x4E30, 0xB7E1, + 0x4E32, 0xB4AE, + 0x4E34, 0xC1D9, + 0x4E36, 0xD8BC, + 0x4E38, 0xCDE8, + 0x4E39, 0xB5A4, + 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, + 0x4E3D, 0xC0F6, + 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, + 0x4E43, 0xC4CB, + 0x4E45, 0xBEC3, + 0x4E47, 0xD8B1, + 0x4E48, 0xC3B4, + 0x4E49, 0xD2E5, + 0x4E4B, 0xD6AE, + 0x4E4C, 0xCEDA, + 0x4E4D, 0xD5A7, + 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, + 0x4E50, 0xC0D6, + 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, + 0x4E54, 0xC7C7, + 0x4E56, 0xB9D4, + 0x4E58, 0xB3CB, + 0x4E59, 0xD2D2, + 0x4E5C, 0xD8BF, + 0x4E5D, 0xBEC5, + 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, + 0x4E60, 0xCFB0, + 0x4E61, 0xCFE7, + 0x4E66, 0xCAE9, + 0x4E69, 0xD8C0, + 0x4E70, 0xC2F2, + 0x4E71, 0xC2D2, + 0x4E73, 0xC8E9, + 0x4E7E, 0xC7AC, + 0x4E86, 0xC1CB, + 0x4E88, 0xD3E8, + 0x4E89, 0xD5F9, + 0x4E8B, 0xCAC2, + 0x4E8C, 0xB6FE, + 0x4E8D, 0xD8A1, + 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, + 0x4E91, 0xD4C6, + 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, + 0x4E94, 0xCEE5, + 0x4E95, 0xBEAE, + 0x4E98, 0xD8A8, + 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, + 0x4E9F, 0xD8BD, + 0x4EA0, 0xD9EF, + 0x4EA1, 0xCDF6, + 0x4EA2, 0xBFBA, + 0x4EA4, 0xBDBB, + 0x4EA5, 0xBAA5, + 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, + 0x4EA8, 0xBAE0, + 0x4EA9, 0xC4B6, + 0x4EAB, 0xCFED, + 0x4EAC, 0xBEA9, + 0x4EAD, 0xCDA4, + 0x4EAE, 0xC1C1, + 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, + 0x4EB5, 0xD9F4, + 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, + 0x4EBF, 0xD2DA, + 0x4EC0, 0xCAB2, + 0x4EC1, 0xC8CA, + 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, + 0x4EC4, 0xD8C6, + 0x4EC5, 0xBDF6, + 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, + 0x4EC9, 0xD8EB, + 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, + 0x4ECD, 0xC8D4, + 0x4ECE, 0xB4D3, + 0x4ED1, 0xC2D8, + 0x4ED3, 0xB2D6, + 0x4ED4, 0xD7D0, + 0x4ED5, 0xCACB, + 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, + 0x4ED8, 0xB8B6, + 0x4ED9, 0xCFC9, + 0x4EDD, 0xD9DA, + 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, + 0x4EE1, 0xD8EE, + 0x4EE3, 0xB4FA, + 0x4EE4, 0xC1EE, + 0x4EE5, 0xD2D4, + 0x4EE8, 0xD8ED, + 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, + 0x4EEC, 0xC3C7, + 0x4EF0, 0xD1F6, + 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, + 0x4EF5, 0xD8F5, + 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, + 0x4EFB, 0xC8CE, + 0x4EFD, 0xB7DD, + 0x4EFF, 0xB7C2, + 0x4F01, 0xC6F3, + 0x4F09, 0xD8F8, + 0x4F0A, 0xD2C1, + 0x4F0D, 0xCEE9, + 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, + 0x4F10, 0xB7A5, + 0x4F11, 0xD0DD, + 0x4F17, 0xD6DA, + 0x4F18, 0xD3C5, + 0x4F19, 0xBBEF, + 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, + 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, + 0x4F20, 0xB4AB, + 0x4F22, 0xD8F3, + 0x4F24, 0xC9CB, + 0x4F25, 0xD8F6, + 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, + 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, + 0x4F2F, 0xB2AE, + 0x4F30, 0xB9C0, + 0x4F32, 0xD9A3, + 0x4F34, 0xB0E9, + 0x4F36, 0xC1E6, + 0x4F38, 0xC9EC, + 0x4F3A, 0xCBC5, + 0x4F3C, 0xCBC6, + 0x4F3D, 0xD9A4, + 0x4F43, 0xB5E8, + 0x4F46, 0xB5AB, + 0x4F4D, 0xCEBB, + 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, + 0x4F50, 0xD7F4, + 0x4F51, 0xD3D3, + 0x4F53, 0xCCE5, + 0x4F55, 0xBACE, + 0x4F57, 0xD9A2, + 0x4F58, 0xD9DC, + 0x4F59, 0xD3E0, + 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, + 0x4F5C, 0xD7F7, + 0x4F5D, 0xD8FE, + 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, + 0x4F60, 0xC4E3, + 0x4F63, 0xD3B6, + 0x4F64, 0xD8F4, + 0x4F65, 0xD9DD, + 0x4F67, 0xD8FB, + 0x4F69, 0xC5E5, + 0x4F6C, 0xC0D0, + 0x4F6F, 0xD1F0, + 0x4F70, 0xB0DB, + 0x4F73, 0xBCD1, + 0x4F74, 0xD9A6, + 0x4F76, 0xD9A5, + 0x4F7B, 0xD9AC, + 0x4F7C, 0xD9AE, + 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, + 0x4F83, 0xD9A9, + 0x4F84, 0xD6B6, + 0x4F88, 0xB3DE, + 0x4F89, 0xD9A8, + 0x4F8B, 0xC0FD, + 0x4F8D, 0xCACC, + 0x4F8F, 0xD9AA, + 0x4F91, 0xD9A7, + 0x4F94, 0xD9B0, + 0x4F97, 0xB6B1, + 0x4F9B, 0xB9A9, + 0x4F9D, 0xD2C0, + 0x4FA0, 0xCFC0, + 0x4FA3, 0xC2C2, + 0x4FA5, 0xBDC4, + 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, + 0x4FA8, 0xC7C8, + 0x4FA9, 0xBFEB, + 0x4FAA, 0xD9AD, + 0x4FAC, 0xD9AF, + 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, + 0x4FB5, 0xC7D6, + 0x4FBF, 0xB1E3, + 0x4FC3, 0xB4D9, + 0x4FC4, 0xB6ED, + 0x4FC5, 0xD9B4, + 0x4FCA, 0xBFA1, + 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, + 0x4FD0, 0xC0FE, + 0x4FD1, 0xD9B8, + 0x4FD7, 0xCBD7, + 0x4FD8, 0xB7FD, + 0x4FDA, 0xD9B5, + 0x4FDC, 0xD9B7, + 0x4FDD, 0xB1A3, + 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, + 0x4FE1, 0xD0C5, + 0x4FE3, 0xD9B6, + 0x4FE6, 0xD9B1, + 0x4FE8, 0xD9B2, + 0x4FE9, 0xC1A9, + 0x4FEA, 0xD9B3, + 0x4FED, 0xBCF3, + 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, + 0x4FF1, 0xBEE3, + 0x4FF3, 0xD9BD, + 0x4FF8, 0xD9BA, + 0x4FFA, 0xB0B3, + 0x4FFE, 0xD9C2, + 0x500C, 0xD9C4, + 0x500D, 0xB1B6, + 0x500F, 0xD9BF, + 0x5012, 0xB5B9, + 0x5014, 0xBEF3, + 0x5018, 0xCCC8, + 0x5019, 0xBAF2, + 0x501A, 0xD2D0, + 0x501C, 0xD9C3, + 0x501F, 0xBDE8, + 0x5021, 0xB3AB, + 0x5025, 0xD9C5, + 0x5026, 0xBEEB, + 0x5028, 0xD9C6, + 0x5029, 0xD9BB, + 0x502A, 0xC4DF, + 0x502C, 0xD9BE, + 0x502D, 0xD9C1, + 0x502E, 0xD9C0, + 0x503A, 0xD5AE, + 0x503C, 0xD6B5, + 0x503E, 0xC7E3, + 0x5043, 0xD9C8, + 0x5047, 0xBCD9, + 0x5048, 0xD9CA, + 0x504C, 0xD9BC, + 0x504E, 0xD9CB, + 0x504F, 0xC6AB, + 0x5055, 0xD9C9, + 0x505A, 0xD7F6, + 0x505C, 0xCDA3, + 0x5065, 0xBDA1, + 0x506C, 0xD9CC, + 0x5076, 0xC5BC, + 0x5077, 0xCDB5, + 0x507B, 0xD9CD, + 0x507E, 0xD9C7, + 0x507F, 0xB3A5, + 0x5080, 0xBFFE, + 0x5085, 0xB8B5, + 0x5088, 0xC0FC, + 0x508D, 0xB0F8, + 0x50A3, 0xB4F6, + 0x50A5, 0xD9CE, + 0x50A7, 0xD9CF, + 0x50A8, 0xB4A2, + 0x50A9, 0xD9D0, + 0x50AC, 0xB4DF, + 0x50B2, 0xB0C1, + 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, + 0x50CF, 0xCFF1, + 0x50D6, 0xD9D2, + 0x50DA, 0xC1C5, + 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, + 0x50EC, 0xD9D5, + 0x50ED, 0xD9D4, + 0x50EE, 0xD9D7, + 0x50F3, 0xCBDB, + 0x50F5, 0xBDA9, + 0x50FB, 0xC6A7, + 0x5106, 0xD9D3, + 0x5107, 0xD9D8, + 0x510B, 0xD9D9, + 0x5112, 0xC8E5, + 0x5121, 0xC0DC, + 0x513F, 0xB6F9, + 0x5140, 0xD8A3, + 0x5141, 0xD4CA, + 0x5143, 0xD4AA, + 0x5144, 0xD0D6, + 0x5145, 0xB3E4, + 0x5146, 0xD5D7, + 0x5148, 0xCFC8, + 0x5149, 0xB9E2, + 0x514B, 0xBFCB, + 0x514D, 0xC3E2, + 0x5151, 0xB6D2, + 0x5154, 0xCDC3, + 0x5155, 0xD9EE, + 0x5156, 0xD9F0, + 0x515A, 0xB5B3, + 0x515C, 0xB6B5, + 0x5162, 0xBEA4, + 0x5165, 0xC8EB, + 0x5168, 0xC8AB, + 0x516B, 0xB0CB, + 0x516C, 0xB9AB, + 0x516D, 0xC1F9, + 0x516E, 0xD9E2, + 0x5170, 0xC0BC, + 0x5171, 0xB9B2, + 0x5173, 0xB9D8, + 0x5174, 0xD0CB, + 0x5175, 0xB1F8, + 0x5176, 0xC6E4, + 0x5177, 0xBEDF, + 0x5178, 0xB5E4, + 0x5179, 0xD7C8, + 0x517B, 0xD1F8, + 0x517C, 0xBCE6, + 0x517D, 0xCADE, + 0x5180, 0xBCBD, + 0x5181, 0xD9E6, + 0x5182, 0xD8E7, + 0x5185, 0xC4DA, + 0x5188, 0xB8D4, + 0x5189, 0xC8BD, + 0x518C, 0xB2E1, + 0x518D, 0xD4D9, + 0x5192, 0xC3B0, + 0x5195, 0xC3E1, + 0x5196, 0xDAA2, + 0x5197, 0xC8DF, + 0x5199, 0xD0B4, + 0x519B, 0xBEFC, + 0x519C, 0xC5A9, + 0x51A0, 0xB9DA, + 0x51A2, 0xDAA3, + 0x51A4, 0xD4A9, + 0x51A5, 0xDAA4, + 0x51AB, 0xD9FB, + 0x51AC, 0xB6AC, + 0x51AF, 0xB7EB, + 0x51B0, 0xB1F9, + 0x51B1, 0xD9FC, + 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, + 0x51B5, 0xBFF6, + 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, + 0x51BB, 0xB6B3, + 0x51BC, 0xD9FE, + 0x51BD, 0xD9FD, + 0x51C0, 0xBEBB, + 0x51C4, 0xC6E0, + 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, + 0x51C9, 0xC1B9, + 0x51CB, 0xB5F2, + 0x51CC, 0xC1E8, + 0x51CF, 0xBCF5, + 0x51D1, 0xB4D5, + 0x51DB, 0xC1DD, + 0x51DD, 0xC4FD, + 0x51E0, 0xBCB8, + 0x51E1, 0xB7B2, + 0x51E4, 0xB7EF, + 0x51EB, 0xD9EC, + 0x51ED, 0xC6BE, + 0x51EF, 0xBFAD, + 0x51F0, 0xBBCB, + 0x51F3, 0xB5CA, + 0x51F5, 0xDBC9, + 0x51F6, 0xD0D7, + 0x51F8, 0xCDB9, + 0x51F9, 0xB0BC, + 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, + 0x51FC, 0xDBCA, + 0x51FD, 0xBAAF, + 0x51FF, 0xD4E4, + 0x5200, 0xB5B6, + 0x5201, 0xB5F3, + 0x5202, 0xD8D6, + 0x5203, 0xC8D0, + 0x5206, 0xB7D6, + 0x5207, 0xC7D0, + 0x5208, 0xD8D7, + 0x520A, 0xBFAF, + 0x520D, 0xDBBB, + 0x520E, 0xD8D8, + 0x5211, 0xD0CC, + 0x5212, 0xBBAE, + 0x5216, 0xEBBE, + 0x5217, 0xC1D0, + 0x5218, 0xC1F5, + 0x5219, 0xD4F2, + 0x521A, 0xB8D5, + 0x521B, 0xB4B4, + 0x521D, 0xB3F5, + 0x5220, 0xC9BE, + 0x5224, 0xC5D0, + 0x5228, 0xC5D9, + 0x5229, 0xC0FB, + 0x522B, 0xB1F0, + 0x522D, 0xD8D9, + 0x522E, 0xB9CE, + 0x5230, 0xB5BD, + 0x5233, 0xD8DA, + 0x5236, 0xD6C6, + 0x5237, 0xCBA2, + 0x5238, 0xC8AF, + 0x5239, 0xC9B2, + 0x523A, 0xB4CC, + 0x523B, 0xBFCC, + 0x523D, 0xB9F4, + 0x523F, 0xD8DB, + 0x5240, 0xD8DC, + 0x5241, 0xB6E7, + 0x5242, 0xBCC1, + 0x5243, 0xCCEA, + 0x524A, 0xCFF7, + 0x524C, 0xD8DD, + 0x524D, 0xC7B0, + 0x5250, 0xB9D0, + 0x5251, 0xBDA3, + 0x5254, 0xCCDE, + 0x5256, 0xC6CA, + 0x525C, 0xD8E0, + 0x525E, 0xD8DE, + 0x5261, 0xD8DF, + 0x5265, 0xB0FE, + 0x5267, 0xBEE7, + 0x5269, 0xCAA3, + 0x526A, 0xBCF4, + 0x526F, 0xB8B1, + 0x5272, 0xB8EE, + 0x527D, 0xD8E2, + 0x527F, 0xBDCB, + 0x5281, 0xD8E4, + 0x5282, 0xD8E3, + 0x5288, 0xC5FC, + 0x5290, 0xD8E5, + 0x5293, 0xD8E6, + 0x529B, 0xC1A6, + 0x529D, 0xC8B0, + 0x529E, 0xB0EC, + 0x529F, 0xB9A6, + 0x52A0, 0xBCD3, + 0x52A1, 0xCEF1, + 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, + 0x52A8, 0xB6AF, + 0x52A9, 0xD6FA, + 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, + 0x52AC, 0xDBBE, + 0x52AD, 0xDBBF, + 0x52B1, 0xC0F8, + 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, + 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, + 0x52C3, 0xB2AA, + 0x52C7, 0xD3C2, + 0x52C9, 0xC3E3, + 0x52CB, 0xD1AB, + 0x52D0, 0xDBC2, + 0x52D2, 0xC0D5, + 0x52D6, 0xDBC3, + 0x52D8, 0xBFB1, + 0x52DF, 0xC4BC, + 0x52E4, 0xC7DA, + 0x52F0, 0xDBC4, + 0x52F9, 0xD9E8, + 0x52FA, 0xC9D7, + 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, + 0x5300, 0xD4C8, + 0x5305, 0xB0FC, + 0x5306, 0xB4D2, + 0x5308, 0xD0D9, + 0x530D, 0xD9E9, + 0x530F, 0xDECB, + 0x5310, 0xD9EB, + 0x5315, 0xD8B0, + 0x5316, 0xBBAF, + 0x5317, 0xB1B1, + 0x5319, 0xB3D7, + 0x531A, 0xD8CE, + 0x531D, 0xD4D1, + 0x5320, 0xBDB3, + 0x5321, 0xBFEF, + 0x5323, 0xCFBB, + 0x5326, 0xD8D0, + 0x532A, 0xB7CB, + 0x532E, 0xD8D1, + 0x5339, 0xC6A5, + 0x533A, 0xC7F8, + 0x533B, 0xD2BD, + 0x533E, 0xD8D2, + 0x533F, 0xC4E4, + 0x5341, 0xCAAE, + 0x5343, 0xC7A7, + 0x5345, 0xD8A6, + 0x5347, 0xC9FD, + 0x5348, 0xCEE7, + 0x5349, 0xBBDC, + 0x534A, 0xB0EB, + 0x534E, 0xBBAA, + 0x534F, 0xD0AD, + 0x5351, 0xB1B0, + 0x5352, 0xD7E4, + 0x5353, 0xD7BF, + 0x5355, 0xB5A5, + 0x5356, 0xC2F4, + 0x5357, 0xC4CF, + 0x535A, 0xB2A9, + 0x535C, 0xB2B7, + 0x535E, 0xB1E5, + 0x535F, 0xDFB2, + 0x5360, 0xD5BC, + 0x5361, 0xBFA8, + 0x5362, 0xC2AC, + 0x5363, 0xD8D5, + 0x5364, 0xC2B1, + 0x5366, 0xD8D4, + 0x5367, 0xCED4, + 0x5369, 0xDAE0, + 0x536B, 0xCEC0, + 0x536E, 0xD8B4, + 0x536F, 0xC3AE, + 0x5370, 0xD3A1, + 0x5371, 0xCEA3, + 0x5373, 0xBCB4, + 0x5374, 0xC8B4, + 0x5375, 0xC2D1, + 0x5377, 0xBEED, + 0x5378, 0xD0B6, + 0x537A, 0xDAE1, + 0x537F, 0xC7E4, + 0x5382, 0xB3A7, + 0x5384, 0xB6F2, + 0x5385, 0xCCFC, + 0x5386, 0xC0FA, + 0x5389, 0xC0F7, + 0x538B, 0xD1B9, + 0x538C, 0xD1E1, + 0x538D, 0xD8C7, + 0x5395, 0xB2DE, + 0x5398, 0xC0E5, + 0x539A, 0xBAF1, + 0x539D, 0xD8C8, + 0x539F, 0xD4AD, + 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, + 0x53A5, 0xD8CA, + 0x53A6, 0xCFC3, + 0x53A8, 0xB3F8, + 0x53A9, 0xBEC7, + 0x53AE, 0xD8CB, + 0x53B6, 0xDBCC, + 0x53BB, 0xC8A5, + 0x53BF, 0xCFD8, + 0x53C1, 0xC8FE, + 0x53C2, 0xB2CE, + 0x53C8, 0xD3D6, + 0x53C9, 0xB2E6, + 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, + 0x53CC, 0xCBAB, + 0x53CD, 0xB7B4, + 0x53D1, 0xB7A2, + 0x53D4, 0xCAE5, + 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, + 0x53D8, 0xB1E4, + 0x53D9, 0xD0F0, + 0x53DB, 0xC5D1, + 0x53DF, 0xDBC5, + 0x53E0, 0xB5FE, + 0x53E3, 0xBFDA, + 0x53E4, 0xB9C5, + 0x53E5, 0xBEE4, + 0x53E6, 0xC1ED, + 0x53E8, 0xDFB6, + 0x53E9, 0xDFB5, + 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, + 0x53EC, 0xD5D9, + 0x53ED, 0xB0C8, + 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, + 0x53F0, 0xCCA8, + 0x53F1, 0xDFB3, + 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, + 0x53F5, 0xD8CF, + 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, + 0x53F8, 0xCBBE, + 0x53F9, 0xCCBE, + 0x53FB, 0xDFB7, + 0x53FC, 0xB5F0, + 0x53FD, 0xDFB4, + 0x5401, 0xD3F5, + 0x5403, 0xB3D4, + 0x5404, 0xB8F7, + 0x5406, 0xDFBA, + 0x5408, 0xBACF, + 0x5409, 0xBCAA, + 0x540A, 0xB5F5, + 0x540C, 0xCDAC, + 0x540D, 0xC3FB, + 0x540E, 0xBAF3, + 0x540F, 0xC0F4, + 0x5410, 0xCDC2, + 0x5411, 0xCFF2, + 0x5412, 0xDFB8, + 0x5413, 0xCFC5, + 0x5415, 0xC2C0, + 0x5416, 0xDFB9, + 0x5417, 0xC2F0, + 0x541B, 0xBEFD, + 0x541D, 0xC1DF, + 0x541E, 0xCDCC, + 0x541F, 0xD2F7, + 0x5420, 0xB7CD, + 0x5421, 0xDFC1, + 0x5423, 0xDFC4, + 0x5426, 0xB7F1, + 0x5427, 0xB0C9, + 0x5428, 0xB6D6, + 0x5429, 0xB7D4, + 0x542B, 0xBAAC, + 0x542C, 0xCCFD, + 0x542D, 0xBFD4, + 0x542E, 0xCBB1, + 0x542F, 0xC6F4, + 0x5431, 0xD6A8, + 0x5432, 0xDFC5, + 0x5434, 0xCEE2, + 0x5435, 0xB3B3, + 0x5438, 0xCEFC, + 0x5439, 0xB4B5, + 0x543B, 0xCEC7, + 0x543C, 0xBAF0, + 0x543E, 0xCEE1, + 0x5440, 0xD1BD, + 0x5443, 0xDFC0, + 0x5446, 0xB4F4, + 0x5448, 0xB3CA, + 0x544A, 0xB8E6, + 0x544B, 0xDFBB, + 0x5450, 0xC4C5, + 0x5452, 0xDFBC, + 0x5453, 0xDFBD, + 0x5454, 0xDFBE, + 0x5455, 0xC5BB, + 0x5456, 0xDFBF, + 0x5457, 0xDFC2, + 0x5458, 0xD4B1, + 0x5459, 0xDFC3, + 0x545B, 0xC7BA, + 0x545C, 0xCED8, + 0x5462, 0xC4D8, + 0x5464, 0xDFCA, + 0x5466, 0xDFCF, + 0x5468, 0xD6DC, + 0x5471, 0xDFC9, + 0x5472, 0xDFDA, + 0x5473, 0xCEB6, + 0x5475, 0xBAC7, + 0x5476, 0xDFCE, + 0x5477, 0xDFC8, + 0x5478, 0xC5DE, + 0x547B, 0xC9EB, + 0x547C, 0xBAF4, + 0x547D, 0xC3FC, + 0x5480, 0xBED7, + 0x5482, 0xDFC6, + 0x5484, 0xDFCD, + 0x5486, 0xC5D8, + 0x548B, 0xD5A6, + 0x548C, 0xBACD, + 0x548E, 0xBECC, + 0x548F, 0xD3BD, + 0x5490, 0xB8C0, + 0x5492, 0xD6E4, + 0x5494, 0xDFC7, + 0x5495, 0xB9BE, + 0x5496, 0xBFA7, + 0x5499, 0xC1FC, + 0x549A, 0xDFCB, + 0x549B, 0xDFCC, + 0x549D, 0xDFD0, + 0x54A3, 0xDFDB, + 0x54A4, 0xDFE5, + 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, + 0x54A8, 0xD7C9, + 0x54A9, 0xDFE3, + 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, + 0x54AC, 0xD2A7, + 0x54AD, 0xDFD2, + 0x54AF, 0xBFA9, + 0x54B1, 0xD4DB, + 0x54B3, 0xBFC8, + 0x54B4, 0xDFD4, + 0x54B8, 0xCFCC, + 0x54BB, 0xDFDD, + 0x54BD, 0xD1CA, + 0x54BF, 0xDFDE, + 0x54C0, 0xB0A7, + 0x54C1, 0xC6B7, + 0x54C2, 0xDFD3, + 0x54C4, 0xBAE5, + 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, + 0x54C8, 0xB9FE, + 0x54C9, 0xD4D5, + 0x54CC, 0xDFDF, + 0x54CD, 0xCFEC, + 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, + 0x54D0, 0xDFD1, + 0x54D1, 0xD1C6, + 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, + 0x54D4, 0xDFD9, + 0x54D5, 0xDFDC, + 0x54D7, 0xBBA9, + 0x54D9, 0xDFE0, + 0x54DA, 0xDFE1, + 0x54DC, 0xDFE2, + 0x54DD, 0xDFE6, + 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, + 0x54E5, 0xB8E7, + 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, + 0x54E8, 0xC9DA, + 0x54E9, 0xC1A8, + 0x54EA, 0xC4C4, + 0x54ED, 0xBFDE, + 0x54EE, 0xCFF8, + 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, + 0x54FA, 0xB2B8, + 0x54FC, 0xBADF, + 0x54FD, 0xDFEC, + 0x54FF, 0xDBC1, + 0x5501, 0xD1E4, + 0x5506, 0xCBF4, + 0x5507, 0xB4BD, + 0x5509, 0xB0A6, + 0x550F, 0xDFF1, + 0x5510, 0xCCC6, + 0x5511, 0xDFF2, + 0x5514, 0xDFED, + 0x551B, 0xDFE9, + 0x5520, 0xDFEB, + 0x5522, 0xDFEF, + 0x5523, 0xDFF0, + 0x5524, 0xBBBD, + 0x5527, 0xDFF3, + 0x552A, 0xDFF4, + 0x552C, 0xBBA3, + 0x552E, 0xCADB, + 0x552F, 0xCEA8, + 0x5530, 0xE0A7, + 0x5531, 0xB3AA, + 0x5533, 0xE0A6, + 0x5537, 0xE0A1, + 0x553C, 0xDFFE, + 0x553E, 0xCDD9, + 0x553F, 0xDFFC, + 0x5541, 0xDFFA, + 0x5543, 0xBFD0, + 0x5544, 0xD7C4, + 0x5546, 0xC9CC, + 0x5549, 0xDFF8, + 0x554A, 0xB0A1, + 0x5550, 0xDFFD, + 0x5555, 0xDFFB, + 0x5556, 0xE0A2, + 0x555C, 0xE0A8, + 0x5561, 0xB7C8, + 0x5564, 0xC6A1, + 0x5565, 0xC9B6, + 0x5566, 0xC0B2, + 0x5567, 0xDFF5, + 0x556A, 0xC5BE, + 0x556C, 0xD8C4, + 0x556D, 0xDFF9, + 0x556E, 0xC4F6, + 0x5575, 0xE0A3, + 0x5576, 0xE0A4, + 0x5577, 0xE0A5, + 0x5578, 0xD0A5, + 0x557B, 0xE0B4, + 0x557C, 0xCCE4, + 0x557E, 0xE0B1, + 0x5580, 0xBFA6, + 0x5581, 0xE0AF, + 0x5582, 0xCEB9, + 0x5583, 0xE0AB, + 0x5584, 0xC9C6, + 0x5587, 0xC0AE, + 0x5588, 0xE0AE, + 0x5589, 0xBAED, + 0x558A, 0xBAB0, + 0x558B, 0xE0A9, + 0x558F, 0xDFF6, + 0x5591, 0xE0B3, + 0x5594, 0xE0B8, + 0x5598, 0xB4AD, + 0x5599, 0xE0B9, + 0x559C, 0xCFB2, + 0x559D, 0xBAC8, + 0x559F, 0xE0B0, + 0x55A7, 0xD0FA, + 0x55B1, 0xE0AC, + 0x55B3, 0xD4FB, + 0x55B5, 0xDFF7, + 0x55B7, 0xC5E7, + 0x55B9, 0xE0AD, + 0x55BB, 0xD3F7, + 0x55BD, 0xE0B6, + 0x55BE, 0xE0B7, + 0x55C4, 0xE0C4, + 0x55C5, 0xD0E1, + 0x55C9, 0xE0BC, + 0x55CC, 0xE0C9, + 0x55CD, 0xE0CA, + 0x55D1, 0xE0BE, + 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, + 0x55D4, 0xE0C1, + 0x55D6, 0xE0B2, + 0x55DC, 0xCAC8, + 0x55DD, 0xE0C3, + 0x55DF, 0xE0B5, + 0x55E1, 0xCECB, + 0x55E3, 0xCBC3, + 0x55E4, 0xE0CD, + 0x55E5, 0xE0C6, + 0x55E6, 0xE0C2, + 0x55E8, 0xE0CB, + 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, + 0x55EC, 0xE0C0, + 0x55EF, 0xE0C5, + 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, + 0x55F5, 0xE0CC, + 0x55F7, 0xE0BB, + 0x55FD, 0xCBD4, + 0x55FE, 0xE0D5, + 0x5600, 0xE0D6, + 0x5601, 0xE0D2, + 0x5608, 0xE0D0, + 0x5609, 0xBCCE, + 0x560C, 0xE0D1, + 0x560E, 0xB8C2, + 0x560F, 0xD8C5, + 0x5618, 0xD0EA, + 0x561B, 0xC2EF, + 0x561E, 0xE0CF, + 0x561F, 0xE0BD, + 0x5623, 0xE0D4, + 0x5624, 0xE0D3, + 0x5627, 0xE0D7, + 0x562C, 0xE0DC, + 0x562D, 0xE0D8, + 0x5631, 0xD6F6, + 0x5632, 0xB3B0, + 0x5634, 0xD7EC, + 0x5636, 0xCBBB, + 0x5639, 0xE0DA, + 0x563B, 0xCEFB, + 0x563F, 0xBAD9, + 0x564C, 0xE0E1, + 0x564D, 0xE0DD, + 0x564E, 0xD2AD, + 0x5654, 0xE0E2, + 0x5657, 0xE0DB, + 0x5658, 0xE0D9, + 0x5659, 0xE0DF, + 0x565C, 0xE0E0, + 0x5662, 0xE0DE, + 0x5664, 0xE0E4, + 0x5668, 0xC6F7, + 0x5669, 0xD8AC, + 0x566A, 0xD4EB, + 0x566B, 0xE0E6, + 0x566C, 0xCAC9, + 0x5671, 0xE0E5, + 0x5676, 0xB8C1, + 0x567B, 0xE0E7, + 0x567C, 0xE0E8, + 0x5685, 0xE0E9, + 0x5686, 0xE0E3, + 0x568E, 0xBABF, + 0x568F, 0xCCE7, + 0x5693, 0xE0EA, + 0x56A3, 0xCFF9, + 0x56AF, 0xE0EB, + 0x56B7, 0xC8C2, + 0x56BC, 0xBDC0, + 0x56CA, 0xC4D2, + 0x56D4, 0xE0EC, + 0x56D7, 0xE0ED, + 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, + 0x56DD, 0xE0EE, + 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, + 0x56E0, 0xD2F2, + 0x56E1, 0xE0EF, + 0x56E2, 0xCDC5, + 0x56E4, 0xB6DA, + 0x56EB, 0xE0F1, + 0x56ED, 0xD4B0, + 0x56F0, 0xC0A7, + 0x56F1, 0xB4D1, + 0x56F4, 0xCEA7, + 0x56F5, 0xE0F0, + 0x56F9, 0xE0F2, + 0x56FA, 0xB9CC, + 0x56FD, 0xB9FA, + 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, + 0x5703, 0xC6D4, + 0x5704, 0xE0F4, + 0x5706, 0xD4B2, + 0x5708, 0xC8A6, + 0x5709, 0xE0F6, + 0x570A, 0xE0F5, + 0x571C, 0xE0F7, + 0x571F, 0xCDC1, + 0x5723, 0xCAA5, + 0x5728, 0xD4DA, + 0x5729, 0xDBD7, + 0x572A, 0xDBD9, + 0x572C, 0xDBD8, + 0x572D, 0xB9E7, + 0x572E, 0xDBDC, + 0x572F, 0xDBDD, + 0x5730, 0xB5D8, + 0x5733, 0xDBDA, + 0x5739, 0xDBDB, + 0x573A, 0xB3A1, + 0x573B, 0xDBDF, + 0x573E, 0xBBF8, + 0x5740, 0xD6B7, + 0x5742, 0xDBE0, + 0x5747, 0xBEF9, + 0x574A, 0xB7BB, + 0x574C, 0xDBD0, + 0x574D, 0xCCAE, + 0x574E, 0xBFB2, + 0x574F, 0xBBB5, + 0x5750, 0xD7F8, + 0x5751, 0xBFD3, + 0x5757, 0xBFE9, + 0x575A, 0xBCE1, + 0x575B, 0xCCB3, + 0x575C, 0xDBDE, + 0x575D, 0xB0D3, + 0x575E, 0xCEEB, + 0x575F, 0xB7D8, + 0x5760, 0xD7B9, + 0x5761, 0xC6C2, + 0x5764, 0xC0A4, + 0x5766, 0xCCB9, + 0x5768, 0xDBE7, + 0x5769, 0xDBE1, + 0x576A, 0xC6BA, + 0x576B, 0xDBE3, + 0x576D, 0xDBE8, + 0x576F, 0xC5F7, + 0x5773, 0xDBEA, + 0x5776, 0xDBE9, + 0x5777, 0xBFC0, + 0x577B, 0xDBE6, + 0x577C, 0xDBE5, + 0x5782, 0xB4B9, + 0x5783, 0xC0AC, + 0x5784, 0xC2A2, + 0x5785, 0xDBE2, + 0x5786, 0xDBE4, + 0x578B, 0xD0CD, + 0x578C, 0xDBED, + 0x5792, 0xC0DD, + 0x5793, 0xDBF2, + 0x579B, 0xB6E2, + 0x57A0, 0xDBF3, + 0x57A1, 0xDBD2, + 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, + 0x57A4, 0xDBEC, + 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, + 0x57A9, 0xDBD1, + 0x57AB, 0xB5E6, + 0x57AD, 0xDBEB, + 0x57AE, 0xBFE5, + 0x57B2, 0xDBEE, + 0x57B4, 0xDBF1, + 0x57B8, 0xDBF9, + 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, + 0x57CB, 0xC2F1, + 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, + 0x57D2, 0xDBF8, + 0x57D4, 0xC6D2, + 0x57D5, 0xDBF4, + 0x57D8, 0xDBF5, + 0x57D9, 0xDBF7, + 0x57DA, 0xDBF6, + 0x57DD, 0xDBFE, + 0x57DF, 0xD3F2, + 0x57E0, 0xB2BA, + 0x57E4, 0xDBFD, + 0x57ED, 0xDCA4, + 0x57EF, 0xDBFB, + 0x57F4, 0xDBFA, + 0x57F8, 0xDBFC, + 0x57F9, 0xC5E0, + 0x57FA, 0xBBF9, + 0x57FD, 0xDCA3, + 0x5800, 0xDCA5, + 0x5802, 0xCCC3, + 0x5806, 0xB6D1, + 0x5807, 0xDDC0, + 0x580B, 0xDCA1, + 0x580D, 0xDCA2, + 0x5811, 0xC7B5, + 0x5815, 0xB6E9, + 0x5819, 0xDCA7, + 0x581E, 0xDCA6, + 0x5820, 0xDCA9, + 0x5821, 0xB1A4, + 0x5824, 0xB5CC, + 0x582A, 0xBFB0, + 0x5830, 0xD1DF, + 0x5835, 0xB6C2, + 0x5844, 0xDCA8, + 0x584C, 0xCBFA, + 0x584D, 0xEBF3, + 0x5851, 0xCBDC, + 0x5854, 0xCBFE, + 0x5858, 0xCCC1, + 0x585E, 0xC8FB, + 0x5865, 0xDCAA, + 0x586B, 0xCCEE, + 0x586C, 0xDCAB, + 0x587E, 0xDBD3, + 0x5880, 0xDCAF, + 0x5881, 0xDCAC, + 0x5883, 0xBEB3, + 0x5885, 0xCAFB, + 0x5889, 0xDCAD, + 0x5892, 0xC9CA, + 0x5893, 0xC4B9, + 0x5899, 0xC7BD, + 0x589A, 0xDCAE, + 0x589E, 0xD4F6, + 0x589F, 0xD0E6, + 0x58A8, 0xC4AB, + 0x58A9, 0xB6D5, + 0x58BC, 0xDBD4, + 0x58C1, 0xB1DA, + 0x58C5, 0xDBD5, + 0x58D1, 0xDBD6, + 0x58D5, 0xBABE, + 0x58E4, 0xC8C0, + 0x58EB, 0xCABF, + 0x58EC, 0xC8C9, + 0x58EE, 0xD7B3, + 0x58F0, 0xC9F9, + 0x58F3, 0xBFC7, + 0x58F6, 0xBAF8, + 0x58F9, 0xD2BC, + 0x5902, 0xE2BA, + 0x5904, 0xB4A6, + 0x5907, 0xB1B8, + 0x590D, 0xB8B4, + 0x590F, 0xCFC4, + 0x5914, 0xD9E7, + 0x5915, 0xCFA6, + 0x5916, 0xCDE2, + 0x5919, 0xD9ED, + 0x591A, 0xB6E0, + 0x591C, 0xD2B9, + 0x591F, 0xB9BB, + 0x5924, 0xE2B9, + 0x5925, 0xE2B7, + 0x5927, 0xB4F3, + 0x5929, 0xCCEC, + 0x592A, 0xCCAB, + 0x592B, 0xB7F2, + 0x592D, 0xD8B2, + 0x592E, 0xD1EB, + 0x592F, 0xBABB, + 0x5931, 0xCAA7, + 0x5934, 0xCDB7, + 0x5937, 0xD2C4, + 0x5938, 0xBFE4, + 0x5939, 0xBCD0, + 0x593A, 0xB6E1, + 0x593C, 0xDEC5, + 0x5941, 0xDEC6, + 0x5942, 0xDBBC, + 0x5944, 0xD1D9, + 0x5947, 0xC6E6, + 0x5948, 0xC4CE, + 0x5949, 0xB7EE, + 0x594B, 0xB7DC, + 0x594E, 0xBFFC, + 0x594F, 0xD7E0, + 0x5951, 0xC6F5, + 0x5954, 0xB1BC, + 0x5955, 0xDEC8, + 0x5956, 0xBDB1, + 0x5957, 0xCCD7, + 0x5958, 0xDECA, + 0x595A, 0xDEC9, + 0x5960, 0xB5EC, + 0x5962, 0xC9DD, + 0x5965, 0xB0C2, + 0x5973, 0xC5AE, + 0x5974, 0xC5AB, + 0x5976, 0xC4CC, + 0x5978, 0xBCE9, + 0x5979, 0xCBFD, + 0x597D, 0xBAC3, + 0x5981, 0xE5F9, + 0x5982, 0xC8E7, + 0x5983, 0xE5FA, + 0x5984, 0xCDFD, + 0x5986, 0xD7B1, + 0x5987, 0xB8BE, + 0x5988, 0xC2E8, + 0x598A, 0xC8D1, + 0x598D, 0xE5FB, + 0x5992, 0xB6CA, + 0x5993, 0xBCCB, + 0x5996, 0xD1FD, + 0x5997, 0xE6A1, + 0x5999, 0xC3EE, + 0x599E, 0xE6A4, + 0x59A3, 0xE5FE, + 0x59A4, 0xE6A5, + 0x59A5, 0xCDD7, + 0x59A8, 0xB7C1, + 0x59A9, 0xE5FC, + 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, + 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, + 0x59B2, 0xE6A7, + 0x59B9, 0xC3C3, + 0x59BB, 0xC6DE, + 0x59BE, 0xE6AA, + 0x59C6, 0xC4B7, + 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, + 0x59D0, 0xBDE3, + 0x59D1, 0xB9C3, + 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, + 0x59D4, 0xCEAF, + 0x59D7, 0xE6A9, + 0x59D8, 0xE6B0, + 0x59DA, 0xD2A6, + 0x59DC, 0xBDAA, + 0x59DD, 0xE6AD, + 0x59E3, 0xE6AF, + 0x59E5, 0xC0D1, + 0x59E8, 0xD2CC, + 0x59EC, 0xBCA7, + 0x59F9, 0xE6B1, + 0x59FB, 0xD2F6, + 0x59FF, 0xD7CB, + 0x5A01, 0xCDFE, + 0x5A03, 0xCDDE, + 0x5A04, 0xC2A6, + 0x5A05, 0xE6AB, + 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, + 0x5A08, 0xE6AE, + 0x5A09, 0xE6B3, + 0x5A0C, 0xE6B2, + 0x5A11, 0xE6B6, + 0x5A13, 0xE6B8, + 0x5A18, 0xC4EF, + 0x5A1C, 0xC4C8, + 0x5A1F, 0xBEEA, + 0x5A20, 0xC9EF, + 0x5A23, 0xE6B7, + 0x5A25, 0xB6F0, + 0x5A29, 0xC3E4, + 0x5A31, 0xD3E9, + 0x5A32, 0xE6B4, + 0x5A34, 0xE6B5, + 0x5A36, 0xC8A2, + 0x5A3C, 0xE6BD, + 0x5A40, 0xE6B9, + 0x5A46, 0xC6C5, + 0x5A49, 0xCDF1, + 0x5A4A, 0xE6BB, + 0x5A55, 0xE6BC, + 0x5A5A, 0xBBE9, + 0x5A62, 0xE6BE, + 0x5A67, 0xE6BA, + 0x5A6A, 0xC0B7, + 0x5A74, 0xD3A4, + 0x5A75, 0xE6BF, + 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, + 0x5A7A, 0xE6C4, + 0x5A7F, 0xD0F6, + 0x5A92, 0xC3BD, + 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, + 0x5AAA, 0xE6C1, + 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, + 0x5AB5, 0xEBF4, + 0x5AB8, 0xE6CA, + 0x5ABE, 0xE6C5, + 0x5AC1, 0xBCDE, + 0x5AC2, 0xC9A9, + 0x5AC9, 0xBCB5, + 0x5ACC, 0xCFD3, + 0x5AD2, 0xE6C8, + 0x5AD4, 0xE6C9, + 0x5AD6, 0xE6CE, + 0x5AD8, 0xE6D0, + 0x5ADC, 0xE6D1, + 0x5AE0, 0xE6CB, + 0x5AE1, 0xB5D5, + 0x5AE3, 0xE6CC, + 0x5AE6, 0xE6CF, + 0x5AE9, 0xC4DB, + 0x5AEB, 0xE6C6, + 0x5AF1, 0xE6CD, + 0x5B09, 0xE6D2, + 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, + 0x5B32, 0xE6D5, + 0x5B34, 0xD9F8, + 0x5B37, 0xE6D6, + 0x5B40, 0xE6D7, + 0x5B50, 0xD7D3, + 0x5B51, 0xE6DD, + 0x5B53, 0xE6DE, + 0x5B54, 0xBFD7, + 0x5B55, 0xD4D0, + 0x5B57, 0xD7D6, + 0x5B58, 0xB4E6, + 0x5B59, 0xCBEF, + 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, + 0x5B5C, 0xD7CE, + 0x5B5D, 0xD0A2, + 0x5B5F, 0xC3CF, + 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, + 0x5B64, 0xB9C2, + 0x5B65, 0xE6DB, + 0x5B66, 0xD1A7, + 0x5B69, 0xBAA2, + 0x5B6A, 0xC2CF, + 0x5B6C, 0xD8AB, + 0x5B70, 0xCAEB, + 0x5B71, 0xE5EE, + 0x5B73, 0xE6DC, + 0x5B75, 0xB7F5, + 0x5B7A, 0xC8E6, + 0x5B7D, 0xC4F5, + 0x5B80, 0xE5B2, + 0x5B81, 0xC4FE, + 0x5B83, 0xCBFC, + 0x5B84, 0xE5B3, + 0x5B85, 0xD5AC, + 0x5B87, 0xD3EE, + 0x5B88, 0xCAD8, + 0x5B89, 0xB0B2, + 0x5B8B, 0xCBCE, + 0x5B8C, 0xCDEA, + 0x5B8F, 0xBAEA, + 0x5B93, 0xE5B5, + 0x5B95, 0xE5B4, + 0x5B97, 0xD7DA, + 0x5B98, 0xB9D9, + 0x5B99, 0xD6E6, + 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, + 0x5B9C, 0xD2CB, + 0x5B9D, 0xB1A6, + 0x5B9E, 0xCAB5, + 0x5BA0, 0xB3E8, + 0x5BA1, 0xC9F3, + 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, + 0x5BA4, 0xCAD2, + 0x5BA5, 0xE5B6, + 0x5BA6, 0xBBC2, + 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, + 0x5BB0, 0xD4D7, + 0x5BB3, 0xBAA6, + 0x5BB4, 0xD1E7, + 0x5BB5, 0xCFFC, + 0x5BB6, 0xBCD2, + 0x5BB8, 0xE5B7, + 0x5BB9, 0xC8DD, + 0x5BBD, 0xBFED, + 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, + 0x5BC2, 0xBCC5, + 0x5BC4, 0xBCC4, + 0x5BC5, 0xD2FA, + 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, + 0x5BCC, 0xB8BB, + 0x5BD0, 0xC3C2, + 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, + 0x5BDD, 0xC7DE, + 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, + 0x5BE1, 0xB9D1, + 0x5BE4, 0xE5BB, + 0x5BE5, 0xC1C8, + 0x5BE8, 0xD5AF, + 0x5BEE, 0xE5BC, + 0x5BF0, 0xE5BE, + 0x5BF8, 0xB4E7, + 0x5BF9, 0xB6D4, + 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, + 0x5BFC, 0xB5BC, + 0x5BFF, 0xCAD9, + 0x5C01, 0xB7E2, + 0x5C04, 0xC9E4, + 0x5C06, 0xBDAB, + 0x5C09, 0xCEBE, + 0x5C0A, 0xD7F0, + 0x5C0F, 0xD0A1, + 0x5C11, 0xC9D9, + 0x5C14, 0xB6FB, + 0x5C15, 0xE6D8, + 0x5C16, 0xBCE2, + 0x5C18, 0xB3BE, + 0x5C1A, 0xC9D0, + 0x5C1C, 0xE6D9, + 0x5C1D, 0xB3A2, + 0x5C22, 0xDECC, + 0x5C24, 0xD3C8, + 0x5C25, 0xDECD, + 0x5C27, 0xD2A2, + 0x5C2C, 0xDECE, + 0x5C31, 0xBECD, + 0x5C34, 0xDECF, + 0x5C38, 0xCAAC, + 0x5C39, 0xD2FC, + 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, + 0x5C3C, 0xC4E1, + 0x5C3D, 0xBEA1, + 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, + 0x5C40, 0xBED6, + 0x5C41, 0xC6A8, + 0x5C42, 0xB2E3, + 0x5C45, 0xBED3, + 0x5C48, 0xC7FC, + 0x5C49, 0xCCEB, + 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, + 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, + 0x5C50, 0xE5EC, + 0x5C51, 0xD0BC, + 0x5C55, 0xD5B9, + 0x5C59, 0xE5ED, + 0x5C5E, 0xCAF4, + 0x5C60, 0xCDC0, + 0x5C61, 0xC2C5, + 0x5C63, 0xE5EF, + 0x5C65, 0xC2C4, + 0x5C66, 0xE5F0, + 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, + 0x5C71, 0xC9BD, + 0x5C79, 0xD2D9, + 0x5C7A, 0xE1A8, + 0x5C7F, 0xD3EC, + 0x5C81, 0xCBEA, + 0x5C82, 0xC6F1, + 0x5C88, 0xE1AC, + 0x5C8C, 0xE1A7, + 0x5C8D, 0xE1A9, + 0x5C90, 0xE1AA, + 0x5C91, 0xE1AF, + 0x5C94, 0xB2ED, + 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, + 0x5C98, 0xE1AD, + 0x5C99, 0xE1AE, + 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, + 0x5C9C, 0xE1B1, + 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, + 0x5CA9, 0xD1D2, + 0x5CAB, 0xE1B6, + 0x5CAC, 0xE1B5, + 0x5CAD, 0xC1EB, + 0x5CB1, 0xE1B7, + 0x5CB3, 0xD4C0, + 0x5CB5, 0xE1B2, + 0x5CB7, 0xE1BA, + 0x5CB8, 0xB0B6, + 0x5CBD, 0xE1B4, + 0x5CBF, 0xBFF9, + 0x5CC1, 0xE1B9, + 0x5CC4, 0xE1BB, + 0x5CCB, 0xE1BE, + 0x5CD2, 0xE1BC, + 0x5CD9, 0xD6C5, + 0x5CE1, 0xCFBF, + 0x5CE4, 0xE1BD, + 0x5CE5, 0xE1BF, + 0x5CE6, 0xC2CD, + 0x5CE8, 0xB6EB, + 0x5CEA, 0xD3F8, + 0x5CED, 0xC7CD, + 0x5CF0, 0xB7E5, + 0x5CFB, 0xBEFE, + 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, + 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, + 0x5D0E, 0xC6E9, + 0x5D14, 0xB4DE, + 0x5D16, 0xD1C2, + 0x5D1B, 0xE1C8, + 0x5D1E, 0xE1C6, + 0x5D24, 0xE1C5, + 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, + 0x5D29, 0xB1C0, + 0x5D2D, 0xD5B8, + 0x5D2E, 0xE1C4, + 0x5D34, 0xE1CB, + 0x5D3D, 0xE1CC, + 0x5D3E, 0xE1CA, + 0x5D47, 0xEFFA, + 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, + 0x5D4C, 0xC7B6, + 0x5D58, 0xE1C9, + 0x5D5B, 0xE1CE, + 0x5D5D, 0xE1D0, + 0x5D69, 0xE1D4, + 0x5D6B, 0xE1D1, + 0x5D6C, 0xE1CD, + 0x5D6F, 0xE1CF, + 0x5D74, 0xE1D5, + 0x5D82, 0xE1D6, + 0x5D99, 0xE1D7, + 0x5D9D, 0xE1D8, + 0x5DB7, 0xE1DA, + 0x5DC5, 0xE1DB, + 0x5DCD, 0xCEA1, + 0x5DDB, 0xE7DD, + 0x5DDD, 0xB4A8, + 0x5DDE, 0xD6DD, + 0x5DE1, 0xD1B2, + 0x5DE2, 0xB3B2, + 0x5DE5, 0xB9A4, + 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, + 0x5DE8, 0xBEDE, + 0x5DE9, 0xB9AE, + 0x5DEB, 0xCED7, + 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, + 0x5DF1, 0xBCBA, + 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, + 0x5DF4, 0xB0CD, + 0x5DF7, 0xCFEF, + 0x5DFD, 0xD9E3, + 0x5DFE, 0xBDED, + 0x5E01, 0xB1D2, + 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, + 0x5E05, 0xCBA7, + 0x5E06, 0xB7AB, + 0x5E08, 0xCAA6, + 0x5E0C, 0xCFA3, + 0x5E0F, 0xE0F8, + 0x5E10, 0xD5CA, + 0x5E11, 0xE0FB, + 0x5E14, 0xE0FA, + 0x5E15, 0xC5C1, + 0x5E16, 0xCCFB, + 0x5E18, 0xC1B1, + 0x5E19, 0xE0F9, + 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, + 0x5E1C, 0xD6C4, + 0x5E1D, 0xB5DB, + 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, + 0x5E2D, 0xCFAF, + 0x5E2E, 0xB0EF, + 0x5E31, 0xE0FC, + 0x5E37, 0xE1A1, + 0x5E38, 0xB3A3, + 0x5E3B, 0xE0FD, + 0x5E3C, 0xE0FE, + 0x5E3D, 0xC3B1, + 0x5E42, 0xC3DD, + 0x5E44, 0xE1A2, + 0x5E45, 0xB7F9, + 0x5E4C, 0xBBCF, + 0x5E54, 0xE1A3, + 0x5E55, 0xC4BB, + 0x5E5B, 0xE1A4, + 0x5E5E, 0xE1A5, + 0x5E61, 0xE1A6, + 0x5E62, 0xB4B1, + 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, + 0x5E74, 0xC4EA, + 0x5E76, 0xB2A2, + 0x5E78, 0xD0D2, + 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, + 0x5E7C, 0xD3D7, + 0x5E7D, 0xD3C4, + 0x5E7F, 0xB9E3, + 0x5E80, 0xE2CF, + 0x5E84, 0xD7AF, + 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, + 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, + 0x5E8F, 0xD0F2, + 0x5E90, 0xC2AE, + 0x5E91, 0xE2D0, + 0x5E93, 0xBFE2, + 0x5E94, 0xD3A6, + 0x5E95, 0xB5D7, + 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, + 0x5E99, 0xC3ED, + 0x5E9A, 0xB8FD, + 0x5E9C, 0xB8AE, + 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, + 0x5EA0, 0xE2D4, + 0x5EA5, 0xE2D3, + 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, + 0x5EAD, 0xCDA5, + 0x5EB3, 0xE2D8, + 0x5EB5, 0xE2D6, + 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, + 0x5EB8, 0xD3B9, + 0x5EB9, 0xE2D5, + 0x5EBE, 0xE2D7, + 0x5EC9, 0xC1AE, + 0x5ECA, 0xC0C8, + 0x5ED1, 0xE2DB, + 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, + 0x5ED6, 0xC1CE, + 0x5EDB, 0xE2DC, + 0x5EE8, 0xE2DD, + 0x5EEA, 0xE2DE, + 0x5EF4, 0xDBC8, + 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, + 0x5EFA, 0xBDA8, + 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, + 0x5F00, 0xBFAA, + 0x5F01, 0xDBCD, + 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, + 0x5F04, 0xC5AA, + 0x5F08, 0xDEC4, + 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, + 0x5F0F, 0xCABD, + 0x5F11, 0xDFB1, + 0x5F13, 0xB9AD, + 0x5F15, 0xD2FD, + 0x5F17, 0xB8A5, + 0x5F18, 0xBAEB, + 0x5F1B, 0xB3DA, + 0x5F1F, 0xB5DC, + 0x5F20, 0xD5C5, + 0x5F25, 0xC3D6, + 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, + 0x5F29, 0xE5F3, + 0x5F2A, 0xE5F2, + 0x5F2D, 0xE5F4, + 0x5F2F, 0xCDE4, + 0x5F31, 0xC8F5, + 0x5F39, 0xB5AF, + 0x5F3A, 0xC7BF, + 0x5F3C, 0xE5F6, + 0x5F40, 0xECB0, + 0x5F50, 0xE5E6, + 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, + 0x5F55, 0xC2BC, + 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, + 0x5F58, 0xE5E9, + 0x5F5D, 0xD2CD, + 0x5F61, 0xE1EA, + 0x5F62, 0xD0CE, + 0x5F64, 0xCDAE, + 0x5F66, 0xD1E5, + 0x5F69, 0xB2CA, + 0x5F6A, 0xB1EB, + 0x5F6C, 0xB1F2, + 0x5F6D, 0xC5ED, + 0x5F70, 0xD5C3, + 0x5F71, 0xD3B0, + 0x5F73, 0xE1DC, + 0x5F77, 0xE1DD, + 0x5F79, 0xD2DB, + 0x5F7B, 0xB3B9, + 0x5F7C, 0xB1CB, + 0x5F80, 0xCDF9, + 0x5F81, 0xD5F7, + 0x5F82, 0xE1DE, + 0x5F84, 0xBEB6, + 0x5F85, 0xB4FD, + 0x5F87, 0xE1DF, + 0x5F88, 0xBADC, + 0x5F89, 0xE1E0, + 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, + 0x5F8C, 0xE1E1, + 0x5F90, 0xD0EC, + 0x5F92, 0xCDBD, + 0x5F95, 0xE1E2, + 0x5F97, 0xB5C3, + 0x5F98, 0xC5C7, + 0x5F99, 0xE1E3, + 0x5F9C, 0xE1E4, + 0x5FA1, 0xD3F9, + 0x5FA8, 0xE1E5, + 0x5FAA, 0xD1AD, + 0x5FAD, 0xE1E6, + 0x5FAE, 0xCEA2, + 0x5FB5, 0xE1E7, + 0x5FB7, 0xB5C2, + 0x5FBC, 0xE1E8, + 0x5FBD, 0xBBD5, + 0x5FC3, 0xD0C4, + 0x5FC4, 0xE2E0, + 0x5FC5, 0xB1D8, + 0x5FC6, 0xD2E4, + 0x5FC9, 0xE2E1, + 0x5FCC, 0xBCC9, + 0x5FCD, 0xC8CC, + 0x5FCF, 0xE2E3, + 0x5FD0, 0xECFE, + 0x5FD1, 0xECFD, + 0x5FD2, 0xDFAF, + 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, + 0x5FD8, 0xCDFC, + 0x5FD9, 0xC3A6, + 0x5FDD, 0xE3C3, + 0x5FE0, 0xD6D2, + 0x5FE1, 0xE2E7, + 0x5FE4, 0xE2E8, + 0x5FE7, 0xD3C7, + 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, + 0x5FED, 0xE2ED, + 0x5FEE, 0xE2E5, + 0x5FF1, 0xB3C0, + 0x5FF5, 0xC4EE, + 0x5FF8, 0xE2EE, + 0x5FFB, 0xD0C3, + 0x5FFD, 0xBAF6, + 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, + 0x6000, 0xBBB3, + 0x6001, 0xCCAC, + 0x6002, 0xCBCB, + 0x6003, 0xE2E4, + 0x6004, 0xE2E6, + 0x6005, 0xE2EA, + 0x6006, 0xE2EB, + 0x600A, 0xE2F7, + 0x600D, 0xE2F4, + 0x600E, 0xD4F5, + 0x600F, 0xE2F3, + 0x6012, 0xC5AD, + 0x6014, 0xD5FA, + 0x6015, 0xC5C2, + 0x6016, 0xB2C0, + 0x6019, 0xE2EF, + 0x601B, 0xE2F2, + 0x601C, 0xC1AF, + 0x601D, 0xCBBC, + 0x6020, 0xB5A1, + 0x6021, 0xE2F9, + 0x6025, 0xBCB1, + 0x6026, 0xE2F1, + 0x6027, 0xD0D4, + 0x6028, 0xD4B9, + 0x6029, 0xE2F5, + 0x602A, 0xB9D6, + 0x602B, 0xE2F6, + 0x602F, 0xC7D3, + 0x6035, 0xE2F0, + 0x603B, 0xD7DC, + 0x603C, 0xEDA1, + 0x603F, 0xE2F8, + 0x6041, 0xEDA5, + 0x6042, 0xE2FE, + 0x6043, 0xCAD1, + 0x604B, 0xC1B5, + 0x604D, 0xBBD0, + 0x6050, 0xBFD6, + 0x6052, 0xBAE3, + 0x6055, 0xCBA1, + 0x6059, 0xEDA6, + 0x605A, 0xEDA3, + 0x605D, 0xEDA2, + 0x6062, 0xBBD6, + 0x6063, 0xEDA7, + 0x6064, 0xD0F4, + 0x6067, 0xEDA4, + 0x6068, 0xBADE, + 0x6069, 0xB6F7, + 0x606A, 0xE3A1, + 0x606B, 0xB6B2, + 0x606C, 0xCCF1, + 0x606D, 0xB9A7, + 0x606F, 0xCFA2, + 0x6070, 0xC7A1, + 0x6073, 0xBFD2, + 0x6076, 0xB6F1, + 0x6078, 0xE2FA, + 0x6079, 0xE2FB, + 0x607A, 0xE2FD, + 0x607B, 0xE2FC, + 0x607C, 0xC4D5, + 0x607D, 0xE3A2, + 0x607F, 0xD3C1, + 0x6083, 0xE3A7, + 0x6084, 0xC7C4, + 0x6089, 0xCFA4, + 0x608C, 0xE3A9, + 0x608D, 0xBAB7, + 0x6092, 0xE3A8, + 0x6094, 0xBBDA, + 0x6096, 0xE3A3, + 0x609A, 0xE3A4, + 0x609B, 0xE3AA, + 0x609D, 0xE3A6, + 0x609F, 0xCEF2, + 0x60A0, 0xD3C6, + 0x60A3, 0xBBBC, + 0x60A6, 0xD4C3, + 0x60A8, 0xC4FA, + 0x60AB, 0xEDA8, + 0x60AC, 0xD0FC, + 0x60AD, 0xE3A5, + 0x60AF, 0xC3F5, + 0x60B1, 0xE3AD, + 0x60B2, 0xB1AF, + 0x60B4, 0xE3B2, + 0x60B8, 0xBCC2, + 0x60BB, 0xE3AC, + 0x60BC, 0xB5BF, + 0x60C5, 0xC7E9, + 0x60C6, 0xE3B0, + 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, + 0x60D1, 0xBBF3, + 0x60D5, 0xCCE8, + 0x60D8, 0xE3AF, + 0x60DA, 0xE3B1, + 0x60DC, 0xCFA7, + 0x60DD, 0xE3AE, + 0x60DF, 0xCEA9, + 0x60E0, 0xBBDD, + 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, + 0x60E8, 0xB2D2, + 0x60E9, 0xB3CD, + 0x60EB, 0xB1B9, + 0x60EC, 0xE3AB, + 0x60ED, 0xB2D1, + 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, + 0x60F0, 0xB6E8, + 0x60F3, 0xCFEB, + 0x60F4, 0xE3B7, + 0x60F6, 0xBBCC, + 0x60F9, 0xC8C7, + 0x60FA, 0xD0CA, + 0x6100, 0xE3B8, + 0x6101, 0xB3EE, + 0x6106, 0xEDA9, + 0x6108, 0xD3FA, + 0x6109, 0xD3E4, + 0x610D, 0xEDAA, + 0x610E, 0xE3B9, + 0x610F, 0xD2E2, + 0x6115, 0xE3B5, + 0x611A, 0xD3DE, + 0x611F, 0xB8D0, + 0x6120, 0xE3B3, + 0x6123, 0xE3B6, + 0x6124, 0xB7DF, + 0x6126, 0xE3B4, + 0x6127, 0xC0A2, + 0x612B, 0xE3BA, + 0x613F, 0xD4B8, + 0x6148, 0xB4C8, + 0x614A, 0xE3BB, + 0x614C, 0xBBC5, + 0x614E, 0xC9F7, + 0x6151, 0xC9E5, + 0x6155, 0xC4BD, + 0x615D, 0xEDAB, + 0x6162, 0xC2FD, + 0x6167, 0xBBDB, + 0x6168, 0xBFAE, + 0x6170, 0xCEBF, + 0x6175, 0xE3BC, + 0x6177, 0xBFB6, + 0x618B, 0xB1EF, + 0x618E, 0xD4F7, + 0x6194, 0xE3BE, + 0x619D, 0xEDAD, + 0x61A7, 0xE3BF, + 0x61A8, 0xBAA9, + 0x61A9, 0xEDAC, + 0x61AC, 0xE3BD, + 0x61B7, 0xE3C0, + 0x61BE, 0xBAB6, + 0x61C2, 0xB6AE, + 0x61C8, 0xD0B8, + 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, + 0x61D1, 0xEDAF, + 0x61D2, 0xC0C1, + 0x61D4, 0xE3C1, + 0x61E6, 0xC5B3, + 0x61F5, 0xE3C2, + 0x61FF, 0xDCB2, + 0x6206, 0xEDB0, + 0x6208, 0xB8EA, + 0x620A, 0xCEEC, + 0x620B, 0xEAA7, + 0x620C, 0xD0E7, + 0x620D, 0xCAF9, + 0x620E, 0xC8D6, + 0x620F, 0xCFB7, + 0x6210, 0xB3C9, + 0x6211, 0xCED2, + 0x6212, 0xBDE4, + 0x6215, 0xE3DE, + 0x6216, 0xBBF2, + 0x6217, 0xEAA8, + 0x6218, 0xD5BD, + 0x621A, 0xC6DD, + 0x621B, 0xEAA9, + 0x621F, 0xEAAA, + 0x6221, 0xEAAC, + 0x6222, 0xEAAB, + 0x6224, 0xEAAE, + 0x6225, 0xEAAD, + 0x622A, 0xBDD8, + 0x622C, 0xEAAF, + 0x622E, 0xC2BE, + 0x6233, 0xB4C1, + 0x6234, 0xB4F7, + 0x6237, 0xBBA7, + 0x623D, 0xECE6, + 0x623E, 0xECE5, + 0x623F, 0xB7BF, + 0x6240, 0xCBF9, + 0x6241, 0xB1E2, + 0x6243, 0xECE7, + 0x6247, 0xC9C8, + 0x6248, 0xECE8, + 0x6249, 0xECE9, + 0x624B, 0xCAD6, + 0x624C, 0xDED0, + 0x624D, 0xB2C5, + 0x624E, 0xD4FA, + 0x6251, 0xC6CB, + 0x6252, 0xB0C7, + 0x6253, 0xB4F2, + 0x6254, 0xC8D3, + 0x6258, 0xCDD0, + 0x625B, 0xBFB8, + 0x6263, 0xBFDB, + 0x6266, 0xC7A4, + 0x6267, 0xD6B4, + 0x6269, 0xC0A9, + 0x626A, 0xDED1, + 0x626B, 0xC9A8, + 0x626C, 0xD1EF, + 0x626D, 0xC5A4, + 0x626E, 0xB0E7, + 0x626F, 0xB3B6, + 0x6270, 0xC8C5, + 0x6273, 0xB0E2, + 0x6276, 0xB7F6, + 0x6279, 0xC5FA, + 0x627C, 0xB6F3, + 0x627E, 0xD5D2, + 0x627F, 0xB3D0, + 0x6280, 0xBCBC, + 0x6284, 0xB3AD, + 0x6289, 0xBEF1, + 0x628A, 0xB0D1, + 0x6291, 0xD2D6, + 0x6292, 0xCAE3, + 0x6293, 0xD7A5, + 0x6295, 0xCDB6, + 0x6296, 0xB6B6, + 0x6297, 0xBFB9, + 0x6298, 0xD5DB, + 0x629A, 0xB8A7, + 0x629B, 0xC5D7, + 0x629F, 0xDED2, + 0x62A0, 0xBFD9, + 0x62A1, 0xC2D5, + 0x62A2, 0xC7C0, + 0x62A4, 0xBBA4, + 0x62A5, 0xB1A8, + 0x62A8, 0xC5EA, + 0x62AB, 0xC5FB, + 0x62AC, 0xCCA7, + 0x62B1, 0xB1A7, + 0x62B5, 0xB5D6, + 0x62B9, 0xC4A8, + 0x62BB, 0xDED3, + 0x62BC, 0xD1BA, + 0x62BD, 0xB3E9, + 0x62BF, 0xC3F2, + 0x62C2, 0xB7F7, + 0x62C4, 0xD6F4, + 0x62C5, 0xB5A3, + 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, + 0x62C8, 0xC4E9, + 0x62C9, 0xC0AD, + 0x62CA, 0xDED4, + 0x62CC, 0xB0E8, + 0x62CD, 0xC5C4, + 0x62CE, 0xC1E0, + 0x62D0, 0xB9D5, + 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, + 0x62D4, 0xB0CE, + 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, + 0x62D8, 0xBED0, + 0x62D9, 0xD7BE, + 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, + 0x62DC, 0xB0DD, + 0x62DF, 0xC4E2, + 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, + 0x62E5, 0xD3B5, + 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, + 0x62E8, 0xB2A6, + 0x62E9, 0xD4F1, + 0x62EC, 0xC0A8, + 0x62ED, 0xCAC3, + 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, + 0x62F1, 0xB9B0, + 0x62F3, 0xC8AD, + 0x62F4, 0xCBA9, + 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, + 0x62FC, 0xC6B4, + 0x62FD, 0xD7A7, + 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, + 0x6301, 0xB3D6, + 0x6302, 0xB9D2, + 0x6307, 0xD6B8, + 0x6308, 0xEAFC, + 0x6309, 0xB0B4, + 0x630E, 0xBFE6, + 0x6311, 0xCCF4, + 0x6316, 0xCDDA, + 0x631A, 0xD6BF, + 0x631B, 0xC2CE, + 0x631D, 0xCECE, + 0x631E, 0xCCA2, + 0x631F, 0xD0AE, + 0x6320, 0xC4D3, + 0x6321, 0xB5B2, + 0x6322, 0xDED8, + 0x6323, 0xD5F5, + 0x6324, 0xBCB7, + 0x6325, 0xBBD3, + 0x6328, 0xB0A4, + 0x632A, 0xC5B2, + 0x632B, 0xB4EC, + 0x632F, 0xD5F1, + 0x6332, 0xEAFD, + 0x6339, 0xDEDA, + 0x633A, 0xCDA6, + 0x633D, 0xCDEC, + 0x6342, 0xCEE6, + 0x6343, 0xDEDC, + 0x6345, 0xCDB1, + 0x6346, 0xC0A6, + 0x6349, 0xD7BD, + 0x634B, 0xDEDB, + 0x634C, 0xB0C6, + 0x634D, 0xBAB4, + 0x634E, 0xC9D3, + 0x634F, 0xC4F3, + 0x6350, 0xBEE8, + 0x6355, 0xB2B6, + 0x635E, 0xC0CC, + 0x635F, 0xCBF0, + 0x6361, 0xBCF1, + 0x6362, 0xBBBB, + 0x6363, 0xB5B7, + 0x6367, 0xC5F5, + 0x6369, 0xDEE6, + 0x636D, 0xDEE3, + 0x636E, 0xBEDD, + 0x6371, 0xDEDF, + 0x6376, 0xB4B7, + 0x6377, 0xBDDD, + 0x637A, 0xDEE0, + 0x637B, 0xC4ED, + 0x6380, 0xCFC6, + 0x6382, 0xB5E0, + 0x6387, 0xB6DE, + 0x6388, 0xCADA, + 0x6389, 0xB5F4, + 0x638A, 0xDEE5, + 0x638C, 0xD5C6, + 0x638E, 0xDEE1, + 0x638F, 0xCCCD, + 0x6390, 0xC6FE, + 0x6392, 0xC5C5, + 0x6396, 0xD2B4, + 0x6398, 0xBEF2, + 0x63A0, 0xC2D3, + 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, + 0x63A5, 0xBDD3, + 0x63A7, 0xBFD8, + 0x63A8, 0xCDC6, + 0x63A9, 0xD1DA, + 0x63AA, 0xB4EB, + 0x63AC, 0xDEE4, + 0x63AD, 0xDEDD, + 0x63AE, 0xDEE7, + 0x63B0, 0xEAFE, + 0x63B3, 0xC2B0, + 0x63B4, 0xDEE2, + 0x63B7, 0xD6C0, + 0x63B8, 0xB5A7, + 0x63BA, 0xB2F4, + 0x63BC, 0xDEE8, + 0x63BE, 0xDEF2, + 0x63C4, 0xDEED, + 0x63C6, 0xDEF1, + 0x63C9, 0xC8E0, + 0x63CD, 0xD7E1, + 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, + 0x63D0, 0xCCE1, + 0x63D2, 0xB2E5, + 0x63D6, 0xD2BE, + 0x63DE, 0xDEEE, + 0x63E0, 0xDEEB, + 0x63E1, 0xCED5, + 0x63E3, 0xB4A7, + 0x63E9, 0xBFAB, + 0x63EA, 0xBEBE, + 0x63ED, 0xBDD2, + 0x63F2, 0xDEE9, + 0x63F4, 0xD4AE, + 0x63F6, 0xDEDE, + 0x63F8, 0xDEEA, + 0x63FD, 0xC0BF, + 0x63FF, 0xDEEC, + 0x6400, 0xB2F3, + 0x6401, 0xB8E9, + 0x6402, 0xC2A7, + 0x6405, 0xBDC1, + 0x640B, 0xDEF5, + 0x640C, 0xDEF8, + 0x640F, 0xB2AB, + 0x6410, 0xB4A4, + 0x6413, 0xB4EA, + 0x6414, 0xC9A6, + 0x641B, 0xDEF6, + 0x641C, 0xCBD1, + 0x641E, 0xB8E3, + 0x6420, 0xDEF7, + 0x6421, 0xDEFA, + 0x6426, 0xDEF9, + 0x642A, 0xCCC2, + 0x642C, 0xB0E1, + 0x642D, 0xB4EE, + 0x6434, 0xE5BA, + 0x643A, 0xD0AF, + 0x643D, 0xB2EB, + 0x643F, 0xEBA1, + 0x6441, 0xDEF4, + 0x6444, 0xC9E3, + 0x6445, 0xDEF3, + 0x6446, 0xB0DA, + 0x6447, 0xD2A1, + 0x6448, 0xB1F7, + 0x644A, 0xCCAF, + 0x6452, 0xDEF0, + 0x6454, 0xCBA4, + 0x6458, 0xD5AA, + 0x645E, 0xDEFB, + 0x6467, 0xB4DD, + 0x6469, 0xC4A6, + 0x646D, 0xDEFD, + 0x6478, 0xC3FE, + 0x6479, 0xC4A1, + 0x647A, 0xDFA1, + 0x6482, 0xC1CC, + 0x6484, 0xDEFC, + 0x6485, 0xBEEF, + 0x6487, 0xC6B2, + 0x6491, 0xB3C5, + 0x6492, 0xC8F6, + 0x6495, 0xCBBA, + 0x6496, 0xDEFE, + 0x6499, 0xDFA4, + 0x649E, 0xD7B2, + 0x64A4, 0xB3B7, + 0x64A9, 0xC1C3, + 0x64AC, 0xC7CB, + 0x64AD, 0xB2A5, + 0x64AE, 0xB4E9, + 0x64B0, 0xD7AB, + 0x64B5, 0xC4EC, + 0x64B7, 0xDFA2, + 0x64B8, 0xDFA3, + 0x64BA, 0xDFA5, + 0x64BC, 0xBAB3, + 0x64C0, 0xDFA6, + 0x64C2, 0xC0DE, + 0x64C5, 0xC9C3, + 0x64CD, 0xB2D9, + 0x64CE, 0xC7E6, + 0x64D0, 0xDFA7, + 0x64D2, 0xC7DC, + 0x64D7, 0xDFA8, + 0x64D8, 0xEBA2, + 0x64DE, 0xCBD3, + 0x64E2, 0xDFAA, + 0x64E4, 0xDFA9, + 0x64E6, 0xB2C1, + 0x6500, 0xC5CA, + 0x6509, 0xDFAB, + 0x6512, 0xD4DC, + 0x6518, 0xC8C1, + 0x6525, 0xDFAC, + 0x652B, 0xBEF0, + 0x652E, 0xDFAD, + 0x652F, 0xD6A7, + 0x6534, 0xEAB7, + 0x6535, 0xEBB6, + 0x6536, 0xCAD5, + 0x6538, 0xD8FC, + 0x6539, 0xB8C4, + 0x653B, 0xB9A5, + 0x653E, 0xB7C5, + 0x653F, 0xD5FE, + 0x6545, 0xB9CA, + 0x6548, 0xD0A7, + 0x6549, 0xF4CD, + 0x654C, 0xB5D0, + 0x654F, 0xC3F4, + 0x6551, 0xBEC8, + 0x6555, 0xEBB7, + 0x6556, 0xB0BD, + 0x6559, 0xBDCC, + 0x655B, 0xC1B2, + 0x655D, 0xB1D6, + 0x655E, 0xB3A8, + 0x6562, 0xB8D2, + 0x6563, 0xC9A2, + 0x6566, 0xB6D8, + 0x656B, 0xEBB8, + 0x656C, 0xBEB4, + 0x6570, 0xCAFD, + 0x6572, 0xC7C3, + 0x6574, 0xD5FB, + 0x6577, 0xB7F3, + 0x6587, 0xCEC4, + 0x658B, 0xD5AB, + 0x658C, 0xB1F3, + 0x6590, 0xECB3, + 0x6591, 0xB0DF, + 0x6593, 0xECB5, + 0x6597, 0xB6B7, + 0x6599, 0xC1CF, + 0x659B, 0xF5FA, + 0x659C, 0xD0B1, + 0x659F, 0xD5E5, + 0x65A1, 0xCED3, + 0x65A4, 0xBDEF, + 0x65A5, 0xB3E2, + 0x65A7, 0xB8AB, + 0x65A9, 0xD5B6, + 0x65AB, 0xEDBD, + 0x65AD, 0xB6CF, + 0x65AF, 0xCBB9, + 0x65B0, 0xD0C2, + 0x65B9, 0xB7BD, + 0x65BC, 0xECB6, + 0x65BD, 0xCAA9, + 0x65C1, 0xC5D4, + 0x65C3, 0xECB9, + 0x65C4, 0xECB8, + 0x65C5, 0xC2C3, + 0x65C6, 0xECB7, + 0x65CB, 0xD0FD, + 0x65CC, 0xECBA, + 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, + 0x65D2, 0xECBC, + 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, + 0x65E0, 0xCEDE, + 0x65E2, 0xBCC8, + 0x65E5, 0xC8D5, + 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, + 0x65E8, 0xD6BC, + 0x65E9, 0xD4E7, + 0x65EC, 0xD1AE, + 0x65ED, 0xD0F1, + 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, + 0x65F0, 0xEABA, + 0x65F1, 0xBAB5, + 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, + 0x65FA, 0xCDFA, + 0x6600, 0xEAC0, + 0x6602, 0xB0BA, + 0x6603, 0xEABE, + 0x6606, 0xC0A5, + 0x660A, 0xEABB, + 0x660C, 0xB2FD, + 0x660E, 0xC3F7, + 0x660F, 0xBBE8, + 0x6613, 0xD2D7, + 0x6614, 0xCEF4, + 0x6615, 0xEABF, + 0x6619, 0xEABC, + 0x661D, 0xEAC3, + 0x661F, 0xD0C7, + 0x6620, 0xD3B3, + 0x6625, 0xB4BA, + 0x6627, 0xC3C1, + 0x6628, 0xD7F2, + 0x662D, 0xD5D1, + 0x662F, 0xCAC7, + 0x6631, 0xEAC5, + 0x6634, 0xEAC4, + 0x6635, 0xEAC7, + 0x6636, 0xEAC6, + 0x663C, 0xD6E7, + 0x663E, 0xCFD4, + 0x6641, 0xEACB, + 0x6643, 0xBBCE, + 0x664B, 0xBDFA, + 0x664C, 0xC9CE, + 0x664F, 0xEACC, + 0x6652, 0xC9B9, + 0x6653, 0xCFFE, + 0x6654, 0xEACA, + 0x6655, 0xD4CE, + 0x6656, 0xEACD, + 0x6657, 0xEACF, + 0x665A, 0xCDED, + 0x665F, 0xEAC9, + 0x6661, 0xEACE, + 0x6664, 0xCEEE, + 0x6666, 0xBBDE, + 0x6668, 0xB3BF, + 0x666E, 0xC6D5, + 0x666F, 0xBEB0, + 0x6670, 0xCEFA, + 0x6674, 0xC7E7, + 0x6676, 0xBEA7, + 0x6677, 0xEAD0, + 0x667A, 0xD6C7, + 0x667E, 0xC1C0, + 0x6682, 0xD4DD, + 0x6684, 0xEAD1, + 0x6687, 0xCFBE, + 0x668C, 0xEAD2, + 0x6691, 0xCAEE, + 0x6696, 0xC5AF, + 0x6697, 0xB0B5, + 0x669D, 0xEAD4, + 0x66A7, 0xEAD3, + 0x66A8, 0xF4DF, + 0x66AE, 0xC4BA, + 0x66B4, 0xB1A9, + 0x66B9, 0xE5DF, + 0x66BE, 0xEAD5, + 0x66D9, 0xCAEF, + 0x66DB, 0xEAD6, + 0x66DC, 0xEAD7, + 0x66DD, 0xC6D8, + 0x66E6, 0xEAD8, + 0x66E9, 0xEAD9, + 0x66F0, 0xD4BB, + 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, + 0x66F4, 0xB8FC, + 0x66F7, 0xEAC2, + 0x66F9, 0xB2DC, + 0x66FC, 0xC2FC, + 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, + 0x6700, 0xD7EE, + 0x6708, 0xD4C2, + 0x6709, 0xD3D0, + 0x670A, 0xEBC3, + 0x670B, 0xC5F3, + 0x670D, 0xB7FE, + 0x6710, 0xEBD4, + 0x6714, 0xCBB7, + 0x6715, 0xEBDE, + 0x6717, 0xC0CA, + 0x671B, 0xCDFB, + 0x671D, 0xB3AF, + 0x671F, 0xC6DA, + 0x6726, 0xEBFC, + 0x6728, 0xC4BE, + 0x672A, 0xCEB4, + 0x672B, 0xC4A9, + 0x672C, 0xB1BE, + 0x672D, 0xD4FD, + 0x672F, 0xCAF5, + 0x6731, 0xD6EC, + 0x6734, 0xC6D3, + 0x6735, 0xB6E4, + 0x673A, 0xBBFA, + 0x673D, 0xD0E0, + 0x6740, 0xC9B1, + 0x6742, 0xD4D3, + 0x6743, 0xC8A8, + 0x6746, 0xB8CB, + 0x6748, 0xE8BE, + 0x6749, 0xC9BC, + 0x674C, 0xE8BB, + 0x674E, 0xC0EE, + 0x674F, 0xD0D3, + 0x6750, 0xB2C4, + 0x6751, 0xB4E5, + 0x6753, 0xE8BC, + 0x6756, 0xD5C8, + 0x675C, 0xB6C5, + 0x675E, 0xE8BD, + 0x675F, 0xCAF8, + 0x6760, 0xB8DC, + 0x6761, 0xCCF5, + 0x6765, 0xC0B4, + 0x6768, 0xD1EE, + 0x6769, 0xE8BF, + 0x676A, 0xE8C2, + 0x676D, 0xBABC, + 0x676F, 0xB1AD, + 0x6770, 0xBDDC, + 0x6772, 0xEABD, + 0x6773, 0xE8C3, + 0x6775, 0xE8C6, + 0x6777, 0xE8CB, + 0x677C, 0xE8CC, + 0x677E, 0xCBC9, + 0x677F, 0xB0E5, + 0x6781, 0xBCAB, + 0x6784, 0xB9B9, + 0x6787, 0xE8C1, + 0x6789, 0xCDF7, + 0x678B, 0xE8CA, + 0x6790, 0xCEF6, + 0x6795, 0xD5ED, + 0x6797, 0xC1D6, + 0x6798, 0xE8C4, + 0x679A, 0xC3B6, + 0x679C, 0xB9FB, + 0x679D, 0xD6A6, + 0x679E, 0xE8C8, + 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, + 0x67A5, 0xE8C0, + 0x67A7, 0xE8C5, + 0x67A8, 0xE8C7, + 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, + 0x67AD, 0xE8C9, + 0x67AF, 0xBFDD, + 0x67B0, 0xE8D2, + 0x67B3, 0xE8D7, + 0x67B5, 0xE8D5, + 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, + 0x67B8, 0xE8DB, + 0x67C1, 0xE8DE, + 0x67C3, 0xE8DA, + 0x67C4, 0xB1FA, + 0x67CF, 0xB0D8, + 0x67D0, 0xC4B3, + 0x67D1, 0xB8CC, + 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, + 0x67D4, 0xC8E1, + 0x67D8, 0xE8CF, + 0x67D9, 0xE8D4, + 0x67DA, 0xE8D6, + 0x67DC, 0xB9F1, + 0x67DD, 0xE8D8, + 0x67DE, 0xD7F5, + 0x67E0, 0xC4FB, + 0x67E2, 0xE8DC, + 0x67E5, 0xB2E9, + 0x67E9, 0xE8D1, + 0x67EC, 0xBCED, + 0x67EF, 0xBFC2, + 0x67F0, 0xE8CD, + 0x67F1, 0xD6F9, + 0x67F3, 0xC1F8, + 0x67F4, 0xB2F1, + 0x67FD, 0xE8DF, + 0x67FF, 0xCAC1, + 0x6800, 0xE8D9, + 0x6805, 0xD5A4, + 0x6807, 0xB1EA, + 0x6808, 0xD5BB, + 0x6809, 0xE8CE, + 0x680A, 0xE8D0, + 0x680B, 0xB6B0, + 0x680C, 0xE8D3, + 0x680E, 0xE8DD, + 0x680F, 0xC0B8, + 0x6811, 0xCAF7, + 0x6813, 0xCBA8, + 0x6816, 0xC6DC, + 0x6817, 0xC0F5, + 0x681D, 0xE8E9, + 0x6821, 0xD0A3, + 0x6829, 0xE8F2, + 0x682A, 0xD6EA, + 0x6832, 0xE8E0, + 0x6833, 0xE8E1, + 0x6837, 0xD1F9, + 0x6838, 0xBACB, + 0x6839, 0xB8F9, + 0x683C, 0xB8F1, + 0x683D, 0xD4D4, + 0x683E, 0xE8EF, + 0x6840, 0xE8EE, + 0x6841, 0xE8EC, + 0x6842, 0xB9F0, + 0x6843, 0xCCD2, + 0x6844, 0xE8E6, + 0x6845, 0xCEA6, + 0x6846, 0xBFF2, + 0x6848, 0xB0B8, + 0x6849, 0xE8F1, + 0x684A, 0xE8F0, + 0x684C, 0xD7C0, + 0x684E, 0xE8E4, + 0x6850, 0xCDA9, + 0x6851, 0xC9A3, + 0x6853, 0xBBB8, + 0x6854, 0xBDDB, + 0x6855, 0xE8EA, + 0x6860, 0xE8E2, + 0x6861, 0xE8E3, + 0x6862, 0xE8E5, + 0x6863, 0xB5B5, + 0x6864, 0xE8E7, + 0x6865, 0xC7C5, + 0x6866, 0xE8EB, + 0x6867, 0xE8ED, + 0x6868, 0xBDB0, + 0x6869, 0xD7AE, + 0x686B, 0xE8F8, + 0x6874, 0xE8F5, + 0x6876, 0xCDB0, + 0x6877, 0xE8F6, + 0x6881, 0xC1BA, + 0x6883, 0xE8E8, + 0x6885, 0xC3B7, + 0x6886, 0xB0F0, + 0x688F, 0xE8F4, + 0x6893, 0xE8F7, + 0x6897, 0xB9A3, + 0x68A2, 0xC9D2, + 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, + 0x68A8, 0xC0E6, + 0x68AD, 0xCBF3, + 0x68AF, 0xCCDD, + 0x68B0, 0xD0B5, + 0x68B3, 0xCAE1, + 0x68B5, 0xE8F3, + 0x68C0, 0xBCEC, + 0x68C2, 0xE8F9, + 0x68C9, 0xC3DE, + 0x68CB, 0xC6E5, + 0x68CD, 0xB9F7, + 0x68D2, 0xB0F4, + 0x68D5, 0xD7D8, + 0x68D8, 0xBCAC, + 0x68DA, 0xC5EF, + 0x68E0, 0xCCC4, + 0x68E3, 0xE9A6, + 0x68EE, 0xC9AD, + 0x68F0, 0xE9A2, + 0x68F1, 0xC0E2, + 0x68F5, 0xBFC3, + 0x68F9, 0xE8FE, + 0x68FA, 0xB9D7, + 0x68FC, 0xE8FB, + 0x6901, 0xE9A4, + 0x6905, 0xD2CE, + 0x690B, 0xE9A3, + 0x690D, 0xD6B2, + 0x690E, 0xD7B5, + 0x6910, 0xE9A7, + 0x6912, 0xBDB7, + 0x691F, 0xE8FC, + 0x6920, 0xE8FD, + 0x6924, 0xE9A1, + 0x692D, 0xCDD6, + 0x6930, 0xD2AC, + 0x6934, 0xE9B2, + 0x6939, 0xE9A9, + 0x693D, 0xB4AA, + 0x693F, 0xB4BB, + 0x6942, 0xE9AB, + 0x6954, 0xD0A8, + 0x6957, 0xE9A5, + 0x695A, 0xB3FE, + 0x695D, 0xE9AC, + 0x695E, 0xC0E3, + 0x6960, 0xE9AA, + 0x6963, 0xE9B9, + 0x6966, 0xE9B8, + 0x696B, 0xE9AE, + 0x696E, 0xE8FA, + 0x6971, 0xE9A8, + 0x6977, 0xBFAC, + 0x6978, 0xE9B1, + 0x6979, 0xE9BA, + 0x697C, 0xC2A5, + 0x6980, 0xE9AF, + 0x6982, 0xB8C5, + 0x6984, 0xE9AD, + 0x6986, 0xD3DC, + 0x6987, 0xE9B4, + 0x6988, 0xE9B5, + 0x6989, 0xE9B7, + 0x698D, 0xE9C7, + 0x6994, 0xC0C6, + 0x6995, 0xE9C5, + 0x6998, 0xE9B0, + 0x699B, 0xE9BB, + 0x699C, 0xB0F1, + 0x69A7, 0xE9BC, + 0x69A8, 0xD5A5, + 0x69AB, 0xE9BE, + 0x69AD, 0xE9BF, + 0x69B1, 0xE9C1, + 0x69B4, 0xC1F1, + 0x69B7, 0xC8B6, + 0x69BB, 0xE9BD, + 0x69C1, 0xE9C2, + 0x69CA, 0xE9C3, + 0x69CC, 0xE9B3, + 0x69CE, 0xE9B6, + 0x69D0, 0xBBB1, + 0x69D4, 0xE9C0, + 0x69DB, 0xBCF7, + 0x69DF, 0xE9C4, + 0x69E0, 0xE9C6, + 0x69ED, 0xE9CA, + 0x69F2, 0xE9CE, + 0x69FD, 0xB2DB, + 0x69FF, 0xE9C8, + 0x6A0A, 0xB7AE, + 0x6A17, 0xE9CB, + 0x6A18, 0xE9CC, + 0x6A1F, 0xD5C1, + 0x6A21, 0xC4A3, + 0x6A28, 0xE9D8, + 0x6A2A, 0xBAE1, + 0x6A2F, 0xE9C9, + 0x6A31, 0xD3A3, + 0x6A35, 0xE9D4, + 0x6A3D, 0xE9D7, + 0x6A3E, 0xE9D0, + 0x6A44, 0xE9CF, + 0x6A47, 0xC7C1, + 0x6A50, 0xE9D2, + 0x6A58, 0xE9D9, + 0x6A59, 0xB3C8, + 0x6A5B, 0xE9D3, + 0x6A61, 0xCFF0, + 0x6A65, 0xE9CD, + 0x6A71, 0xB3F7, + 0x6A79, 0xE9D6, + 0x6A7C, 0xE9DA, + 0x6A80, 0xCCB4, + 0x6A84, 0xCFAD, + 0x6A8E, 0xE9D5, + 0x6A90, 0xE9DC, + 0x6A91, 0xE9DB, + 0x6A97, 0xE9DE, + 0x6AA0, 0xE9D1, + 0x6AA9, 0xE9DD, + 0x6AAB, 0xE9DF, + 0x6AAC, 0xC3CA, + 0x6B20, 0xC7B7, + 0x6B21, 0xB4CE, + 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, + 0x6B24, 0xECA3, + 0x6B27, 0xC5B7, + 0x6B32, 0xD3FB, + 0x6B37, 0xECA4, + 0x6B39, 0xECA5, + 0x6B3A, 0xC6DB, + 0x6B3E, 0xBFEE, + 0x6B43, 0xECA6, + 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, + 0x6B49, 0xC7B8, + 0x6B4C, 0xB8E8, + 0x6B59, 0xECA8, + 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, + 0x6B64, 0xB4CB, + 0x6B65, 0xB2BD, + 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, + 0x6B6A, 0xCDE1, + 0x6B79, 0xB4F5, + 0x6B7B, 0xCBC0, + 0x6B7C, 0xBCDF, + 0x6B81, 0xE9E2, + 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, + 0x6B84, 0xE9E5, + 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, + 0x6B89, 0xD1B3, + 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, + 0x6B8D, 0xE9E8, + 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, + 0x6B96, 0xD6B3, + 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, + 0x6BA1, 0xE9EB, + 0x6BAA, 0xE9EC, + 0x6BB3, 0xECAF, + 0x6BB4, 0xC5B9, + 0x6BB5, 0xB6CE, + 0x6BB7, 0xD2F3, + 0x6BBF, 0xB5EE, + 0x6BC1, 0xBBD9, + 0x6BC2, 0xECB1, + 0x6BC5, 0xD2E3, + 0x6BCB, 0xCEE3, + 0x6BCD, 0xC4B8, + 0x6BCF, 0xC3BF, + 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, + 0x6BD4, 0xB1C8, + 0x6BD5, 0xB1CF, + 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, + 0x6BD9, 0xB1D0, + 0x6BDB, 0xC3AB, + 0x6BE1, 0xD5B1, + 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, + 0x6BEF, 0xCCBA, + 0x6BF3, 0xEBA5, + 0x6BF5, 0xEBA7, + 0x6BF9, 0xEBA8, + 0x6BFD, 0xEBA6, + 0x6C05, 0xEBA9, + 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, + 0x6C0D, 0xEBAC, + 0x6C0F, 0xCACF, + 0x6C10, 0xD8B5, + 0x6C11, 0xC3F1, + 0x6C13, 0xC3A5, + 0x6C14, 0xC6F8, + 0x6C15, 0xEBAD, + 0x6C16, 0xC4CA, + 0x6C18, 0xEBAE, + 0x6C19, 0xEBAF, + 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, + 0x6C1F, 0xB7FA, + 0x6C21, 0xEBB1, + 0x6C22, 0xC7E2, + 0x6C24, 0xEBB3, + 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, + 0x6C28, 0xB0B1, + 0x6C29, 0xEBB2, + 0x6C2A, 0xEBB4, + 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, + 0x6C30, 0xC7E8, + 0x6C32, 0xEBB5, + 0x6C34, 0xCBAE, + 0x6C35, 0xE3DF, + 0x6C38, 0xD3C0, + 0x6C3D, 0xD9DB, + 0x6C40, 0xCDA1, + 0x6C41, 0xD6AD, + 0x6C42, 0xC7F3, + 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, + 0x6C49, 0xBABA, + 0x6C4A, 0xE3E2, + 0x6C50, 0xCFAB, + 0x6C54, 0xE3E0, + 0x6C55, 0xC9C7, + 0x6C57, 0xBAB9, + 0x6C5B, 0xD1B4, + 0x6C5C, 0xE3E1, + 0x6C5D, 0xC8EA, + 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, + 0x6C60, 0xB3D8, + 0x6C61, 0xCEDB, + 0x6C64, 0xCCC0, + 0x6C68, 0xE3E8, + 0x6C69, 0xE3E9, + 0x6C6A, 0xCDF4, + 0x6C70, 0xCCAD, + 0x6C72, 0xBCB3, + 0x6C74, 0xE3EA, + 0x6C76, 0xE3EB, + 0x6C79, 0xD0DA, + 0x6C7D, 0xC6FB, + 0x6C7E, 0xB7DA, + 0x6C81, 0xC7DF, + 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, + 0x6C85, 0xE3E4, + 0x6C86, 0xE3EC, + 0x6C88, 0xC9F2, + 0x6C89, 0xB3C1, + 0x6C8C, 0xE3E7, + 0x6C8F, 0xC6E3, + 0x6C90, 0xE3E5, + 0x6C93, 0xEDB3, + 0x6C94, 0xE3E6, + 0x6C99, 0xC9B3, + 0x6C9B, 0xC5E6, + 0x6C9F, 0xB9B5, + 0x6CA1, 0xC3BB, + 0x6CA3, 0xE3E3, + 0x6CA4, 0xC5BD, + 0x6CA5, 0xC1A4, + 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, + 0x6CA9, 0xE3ED, + 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, + 0x6CAD, 0xE3F0, + 0x6CAE, 0xBEDA, + 0x6CB1, 0xE3FB, + 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, + 0x6CB8, 0xB7D0, + 0x6CB9, 0xD3CD, + 0x6CBB, 0xD6CE, + 0x6CBC, 0xD5D3, + 0x6CBD, 0xB9C1, + 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, + 0x6CC4, 0xD0B9, + 0x6CC5, 0xC7F6, + 0x6CC9, 0xC8AA, + 0x6CCA, 0xB2B4, + 0x6CCC, 0xC3DA, + 0x6CD0, 0xE3EE, + 0x6CD3, 0xE3FC, + 0x6CD4, 0xE3EF, + 0x6CD5, 0xB7A8, + 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, + 0x6CDB, 0xB7BA, + 0x6CDE, 0xC5A2, + 0x6CE0, 0xE3F6, + 0x6CE1, 0xC5DD, + 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, + 0x6CE5, 0xC4E0, + 0x6CE8, 0xD7A2, + 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, + 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, + 0x6CF0, 0xCCA9, + 0x6CF1, 0xE3F3, + 0x6CF3, 0xD3BE, + 0x6CF5, 0xB1C3, + 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, + 0x6CF8, 0xE3F2, + 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, + 0x6CFC, 0xC6C3, + 0x6CFD, 0xD4F3, + 0x6CFE, 0xE3FE, + 0x6D01, 0xBDE0, + 0x6D04, 0xE4A7, + 0x6D07, 0xE4A6, + 0x6D0B, 0xD1F3, + 0x6D0C, 0xE4A3, + 0x6D0E, 0xE4A9, + 0x6D12, 0xC8F7, + 0x6D17, 0xCFB4, + 0x6D19, 0xE4A8, + 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, + 0x6D1E, 0xB6B4, + 0x6D25, 0xBDF2, + 0x6D27, 0xE4A2, + 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, + 0x6D2E, 0xE4AC, + 0x6D31, 0xB6FD, + 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, + 0x6D35, 0xE4AD, + 0x6D39, 0xE4A1, + 0x6D3B, 0xBBEE, + 0x6D3C, 0xCDDD, + 0x6D3D, 0xC7A2, + 0x6D3E, 0xC5C9, + 0x6D41, 0xC1F7, + 0x6D43, 0xE4A4, + 0x6D45, 0xC7B3, + 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, + 0x6D48, 0xE4A5, + 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, + 0x6D4D, 0xE4AB, + 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, + 0x6D51, 0xBBEB, + 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, + 0x6D54, 0xE4B1, + 0x6D59, 0xD5E3, + 0x6D5A, 0xBFA3, + 0x6D5C, 0xE4BA, + 0x6D5E, 0xE4B7, + 0x6D60, 0xE4BB, + 0x6D63, 0xE4BD, + 0x6D66, 0xC6D6, + 0x6D69, 0xBAC6, + 0x6D6A, 0xC0CB, + 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, + 0x6D74, 0xD4A1, + 0x6D77, 0xBAA3, + 0x6D78, 0xBDFE, + 0x6D7C, 0xE4BC, + 0x6D82, 0xCDBF, + 0x6D85, 0xC4F9, + 0x6D88, 0xCFFB, + 0x6D89, 0xC9E6, + 0x6D8C, 0xD3BF, + 0x6D8E, 0xCFD1, + 0x6D91, 0xE4B3, + 0x6D93, 0xE4B8, + 0x6D94, 0xE4B9, + 0x6D95, 0xCCE9, + 0x6D9B, 0xCCCE, + 0x6D9D, 0xC0D4, + 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, + 0x6DA0, 0xE4B6, + 0x6DA1, 0xCED0, + 0x6DA3, 0xBBC1, + 0x6DA4, 0xB5D3, + 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, + 0x6DA8, 0xD5C7, + 0x6DA9, 0xC9AC, + 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, + 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, + 0x6DB2, 0xD2BA, + 0x6DB5, 0xBAAD, + 0x6DB8, 0xBAD4, + 0x6DBF, 0xE4C3, + 0x6DC0, 0xB5ED, + 0x6DC4, 0xD7CD, + 0x6DC5, 0xE4C0, + 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, + 0x6DCB, 0xC1DC, + 0x6DCC, 0xCCCA, + 0x6DD1, 0xCAE7, + 0x6DD6, 0xC4D7, + 0x6DD8, 0xCCD4, + 0x6DD9, 0xE4C8, + 0x6DDD, 0xE4C7, + 0x6DDE, 0xE4C1, + 0x6DE0, 0xE4C4, + 0x6DE1, 0xB5AD, + 0x6DE4, 0xD3D9, + 0x6DE6, 0xE4C6, + 0x6DEB, 0xD2F9, + 0x6DEC, 0xB4E3, + 0x6DEE, 0xBBB4, + 0x6DF1, 0xC9EE, + 0x6DF3, 0xB4BE, + 0x6DF7, 0xBBEC, + 0x6DF9, 0xD1CD, + 0x6DFB, 0xCCED, + 0x6DFC, 0xEDB5, + 0x6E05, 0xC7E5, + 0x6E0A, 0xD4A8, + 0x6E0C, 0xE4CB, + 0x6E0D, 0xD7D5, + 0x6E0E, 0xE4C2, + 0x6E10, 0xBDA5, + 0x6E11, 0xE4C5, + 0x6E14, 0xD3E6, + 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, + 0x6E1A, 0xE4BE, + 0x6E1D, 0xD3E5, + 0x6E20, 0xC7FE, + 0x6E21, 0xB6C9, + 0x6E23, 0xD4FC, + 0x6E24, 0xB2B3, + 0x6E25, 0xE4D7, + 0x6E29, 0xCEC2, + 0x6E2B, 0xE4CD, + 0x6E2D, 0xCEBC, + 0x6E2F, 0xB8DB, + 0x6E32, 0xE4D6, + 0x6E34, 0xBFCA, + 0x6E38, 0xD3CE, + 0x6E3A, 0xC3EC, + 0x6E43, 0xC5C8, + 0x6E44, 0xE4D8, + 0x6E4D, 0xCDC4, + 0x6E4E, 0xE4CF, + 0x6E53, 0xE4D4, + 0x6E54, 0xE4D5, + 0x6E56, 0xBAFE, + 0x6E58, 0xCFE6, + 0x6E5B, 0xD5BF, + 0x6E5F, 0xE4D2, + 0x6E6B, 0xE4D0, + 0x6E6E, 0xE4CE, + 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, + 0x6E83, 0xC0A3, + 0x6E85, 0xBDA6, + 0x6E86, 0xE4D3, + 0x6E89, 0xB8C8, + 0x6E8F, 0xE4E7, + 0x6E90, 0xD4B4, + 0x6E98, 0xE4DB, + 0x6E9C, 0xC1EF, + 0x6E9F, 0xE4E9, + 0x6EA2, 0xD2E7, + 0x6EA5, 0xE4DF, + 0x6EA7, 0xE4E0, + 0x6EAA, 0xCFAA, + 0x6EAF, 0xCBDD, + 0x6EB1, 0xE4DA, + 0x6EB2, 0xE4D1, + 0x6EB4, 0xE4E5, + 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, + 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, + 0x6EBD, 0xE4E1, + 0x6EC1, 0xB3FC, + 0x6EC2, 0xE4E8, + 0x6EC7, 0xB5E1, + 0x6ECB, 0xD7CC, + 0x6ECF, 0xE4E6, + 0x6ED1, 0xBBAC, + 0x6ED3, 0xD7D2, + 0x6ED4, 0xCCCF, + 0x6ED5, 0xEBF8, + 0x6ED7, 0xE4E4, + 0x6EDA, 0xB9F6, + 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, + 0x6EE0, 0xE4DC, + 0x6EE1, 0xC2FA, + 0x6EE2, 0xE4DE, + 0x6EE4, 0xC2CB, + 0x6EE5, 0xC0C4, + 0x6EE6, 0xC2D0, + 0x6EE8, 0xB1F5, + 0x6EE9, 0xCCB2, + 0x6EF4, 0xB5CE, + 0x6EF9, 0xE4EF, + 0x6F02, 0xC6AF, + 0x6F06, 0xC6E1, + 0x6F09, 0xE4F5, + 0x6F0F, 0xC2A9, + 0x6F13, 0xC0EC, + 0x6F14, 0xD1DD, + 0x6F15, 0xE4EE, + 0x6F20, 0xC4AE, + 0x6F24, 0xE4ED, + 0x6F29, 0xE4F6, + 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, + 0x6F2D, 0xE4DD, + 0x6F2F, 0xE4F0, + 0x6F31, 0xCAFE, + 0x6F33, 0xD5C4, + 0x6F36, 0xE4F1, + 0x6F3E, 0xD1FA, + 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, + 0x6F4B, 0xE4F2, + 0x6F4D, 0xCEAB, + 0x6F58, 0xC5CB, + 0x6F5C, 0xC7B1, + 0x6F5E, 0xC2BA, + 0x6F62, 0xE4EA, + 0x6F66, 0xC1CA, + 0x6F6D, 0xCCB6, + 0x6F6E, 0xB3B1, + 0x6F72, 0xE4FB, + 0x6F74, 0xE4F3, + 0x6F78, 0xE4FA, + 0x6F7A, 0xE4FD, + 0x6F7C, 0xE4FC, + 0x6F84, 0xB3CE, + 0x6F88, 0xB3BA, + 0x6F89, 0xE4F7, + 0x6F8C, 0xE4F9, + 0x6F8D, 0xE4F8, + 0x6F8E, 0xC5EC, + 0x6F9C, 0xC0BD, + 0x6FA1, 0xD4E8, + 0x6FA7, 0xE5A2, + 0x6FB3, 0xB0C4, + 0x6FB6, 0xE5A4, + 0x6FB9, 0xE5A3, + 0x6FC0, 0xBCA4, + 0x6FC2, 0xE5A5, + 0x6FC9, 0xE5A1, + 0x6FD1, 0xE4FE, + 0x6FD2, 0xB1F4, + 0x6FDE, 0xE5A8, + 0x6FE0, 0xE5A9, + 0x6FE1, 0xE5A6, + 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, + 0x7011, 0xC6D9, + 0x701A, 0xE5AB, + 0x701B, 0xE5AD, + 0x7023, 0xE5AC, + 0x7035, 0xE5AF, + 0x7039, 0xE5AE, + 0x704C, 0xB9E0, + 0x704F, 0xE5B0, + 0x705E, 0xE5B1, + 0x706B, 0xBBF0, + 0x706C, 0xECE1, + 0x706D, 0xC3F0, + 0x706F, 0xB5C6, + 0x7070, 0xBBD2, + 0x7075, 0xC1E9, + 0x7076, 0xD4EE, + 0x7078, 0xBEC4, + 0x707C, 0xD7C6, + 0x707E, 0xD4D6, + 0x707F, 0xB2D3, + 0x7080, 0xECBE, + 0x7085, 0xEAC1, + 0x7089, 0xC2AF, + 0x708A, 0xB4B6, + 0x708E, 0xD1D7, + 0x7092, 0xB3B4, + 0x7094, 0xC8B2, + 0x7095, 0xBFBB, + 0x7096, 0xECC0, + 0x7099, 0xD6CB, + 0x709C, 0xECBF, + 0x709D, 0xECC1, + 0x70AB, 0xECC5, + 0x70AC, 0xBEE6, + 0x70AD, 0xCCBF, + 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, + 0x70B1, 0xECC6, + 0x70B3, 0xB1FE, + 0x70B7, 0xECC4, + 0x70B8, 0xD5A8, + 0x70B9, 0xB5E3, + 0x70BB, 0xECC2, + 0x70BC, 0xC1B6, + 0x70BD, 0xB3E3, + 0x70C0, 0xECC3, + 0x70C1, 0xCBB8, + 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, + 0x70C8, 0xC1D2, + 0x70CA, 0xECC8, + 0x70D8, 0xBAE6, + 0x70D9, 0xC0D3, + 0x70DB, 0xD6F2, + 0x70DF, 0xD1CC, + 0x70E4, 0xBFBE, + 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, + 0x70E8, 0xECC7, + 0x70E9, 0xBBE2, + 0x70EB, 0xCCCC, + 0x70EC, 0xBDFD, + 0x70ED, 0xC8C8, + 0x70EF, 0xCFA9, + 0x70F7, 0xCDE9, + 0x70F9, 0xC5EB, + 0x70FD, 0xB7E9, + 0x7109, 0xD1C9, + 0x710A, 0xBAB8, + 0x7110, 0xECC9, + 0x7113, 0xECCA, + 0x7115, 0xBBC0, + 0x7116, 0xECCB, + 0x7118, 0xECE2, + 0x7119, 0xB1BA, + 0x711A, 0xB7D9, + 0x7126, 0xBDB9, + 0x712F, 0xECCC, + 0x7130, 0xD1E6, + 0x7131, 0xECCD, + 0x7136, 0xC8BB, + 0x7145, 0xECD1, + 0x714A, 0xECD3, + 0x714C, 0xBBCD, + 0x714E, 0xBCE5, + 0x715C, 0xECCF, + 0x715E, 0xC9B7, + 0x7164, 0xC3BA, + 0x7166, 0xECE3, + 0x7167, 0xD5D5, + 0x7168, 0xECD0, + 0x716E, 0xD6F3, + 0x7172, 0xECD2, + 0x7173, 0xECCE, + 0x7178, 0xECD4, + 0x717A, 0xECD5, + 0x717D, 0xC9BF, + 0x7184, 0xCFA8, + 0x718A, 0xD0DC, + 0x718F, 0xD1AC, + 0x7194, 0xC8DB, + 0x7198, 0xECD6, + 0x7199, 0xCEF5, + 0x719F, 0xCAEC, + 0x71A0, 0xECDA, + 0x71A8, 0xECD9, + 0x71AC, 0xB0BE, + 0x71B3, 0xECD7, + 0x71B5, 0xECD8, + 0x71B9, 0xECE4, + 0x71C3, 0xC8BC, + 0x71CE, 0xC1C7, + 0x71D4, 0xECDC, + 0x71D5, 0xD1E0, + 0x71E0, 0xECDB, + 0x71E5, 0xD4EF, + 0x71E7, 0xECDD, + 0x71EE, 0xDBC6, + 0x71F9, 0xECDE, + 0x7206, 0xB1AC, + 0x721D, 0xECDF, + 0x7228, 0xECE0, + 0x722A, 0xD7A6, + 0x722C, 0xC5C0, + 0x7230, 0xEBBC, + 0x7231, 0xB0AE, + 0x7235, 0xBEF4, + 0x7236, 0xB8B8, + 0x7237, 0xD2AF, + 0x7238, 0xB0D6, + 0x7239, 0xB5F9, + 0x723B, 0xD8B3, + 0x723D, 0xCBAC, + 0x723F, 0xE3DD, + 0x7247, 0xC6AC, + 0x7248, 0xB0E6, + 0x724C, 0xC5C6, + 0x724D, 0xEBB9, + 0x7252, 0xEBBA, + 0x7256, 0xEBBB, + 0x7259, 0xD1C0, + 0x725B, 0xC5A3, + 0x725D, 0xEAF2, + 0x725F, 0xC4B2, + 0x7261, 0xC4B5, + 0x7262, 0xC0CE, + 0x7266, 0xEAF3, + 0x7267, 0xC4C1, + 0x7269, 0xCEEF, + 0x726E, 0xEAF0, + 0x726F, 0xEAF4, + 0x7272, 0xC9FC, + 0x7275, 0xC7A3, + 0x7279, 0xCCD8, + 0x727A, 0xCEFE, + 0x727E, 0xEAF5, + 0x727F, 0xEAF6, + 0x7280, 0xCFAC, + 0x7281, 0xC0E7, + 0x7284, 0xEAF7, + 0x728A, 0xB6BF, + 0x728B, 0xEAF8, + 0x728D, 0xEAF9, + 0x728F, 0xEAFA, + 0x7292, 0xEAFB, + 0x729F, 0xEAF1, + 0x72AC, 0xC8AE, + 0x72AD, 0xE1EB, + 0x72AF, 0xB7B8, + 0x72B0, 0xE1EC, + 0x72B4, 0xE1ED, + 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, + 0x72B8, 0xE1EF, + 0x72B9, 0xD3CC, + 0x72C1, 0xE1F1, + 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, + 0x72C4, 0xB5D2, + 0x72C8, 0xB1B7, + 0x72CD, 0xE1F3, + 0x72CE, 0xE1F2, + 0x72D0, 0xBAFC, + 0x72D2, 0xE1F4, + 0x72D7, 0xB9B7, + 0x72D9, 0xBED1, + 0x72DE, 0xC4FC, + 0x72E0, 0xBADD, + 0x72E1, 0xBDC6, + 0x72E8, 0xE1F5, + 0x72E9, 0xE1F7, + 0x72EC, 0xB6C0, + 0x72ED, 0xCFC1, + 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, + 0x72F0, 0xD5F8, + 0x72F1, 0xD3FC, + 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, + 0x72F4, 0xE1F9, + 0x72F7, 0xE1FA, + 0x72F8, 0xC0EA, + 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, + 0x72FC, 0xC0C7, + 0x7301, 0xE1FB, + 0x7303, 0xE1FD, + 0x730A, 0xE2A5, + 0x730E, 0xC1D4, + 0x7313, 0xE2A3, + 0x7315, 0xE2A8, + 0x7316, 0xB2FE, + 0x7317, 0xE2A2, + 0x731B, 0xC3CD, + 0x731C, 0xB2C2, + 0x731D, 0xE2A7, + 0x731E, 0xE2A6, + 0x7321, 0xE2A4, + 0x7322, 0xE2A9, + 0x7325, 0xE2AB, + 0x7329, 0xD0C9, + 0x732A, 0xD6ED, + 0x732B, 0xC3A8, + 0x732C, 0xE2AC, + 0x732E, 0xCFD7, + 0x7331, 0xE2AE, + 0x7334, 0xBAEF, + 0x7337, 0xE9E0, + 0x7338, 0xE2AD, + 0x7339, 0xE2AA, + 0x733E, 0xBBAB, + 0x733F, 0xD4B3, + 0x734D, 0xE2B0, + 0x7350, 0xE2AF, + 0x7352, 0xE9E1, + 0x7357, 0xE2B1, + 0x7360, 0xE2B2, + 0x736C, 0xE2B3, + 0x736D, 0xCCA1, + 0x736F, 0xE2B4, + 0x737E, 0xE2B5, + 0x7384, 0xD0FE, + 0x7387, 0xC2CA, + 0x7389, 0xD3F1, + 0x738B, 0xCDF5, + 0x738E, 0xE7E0, + 0x7391, 0xE7E1, + 0x7396, 0xBEC1, + 0x739B, 0xC2EA, + 0x739F, 0xE7E4, + 0x73A2, 0xE7E3, + 0x73A9, 0xCDE6, + 0x73AB, 0xC3B5, + 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, + 0x73B0, 0xCFD6, + 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, + 0x73B7, 0xE7E8, + 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, + 0x73C0, 0xE7EA, + 0x73C2, 0xE7E6, + 0x73C8, 0xE7EC, + 0x73C9, 0xE7EB, + 0x73CA, 0xC9BA, + 0x73CD, 0xD5E4, + 0x73CF, 0xE7E5, + 0x73D0, 0xB7A9, + 0x73D1, 0xE7E7, + 0x73D9, 0xE7EE, + 0x73DE, 0xE7F3, + 0x73E0, 0xD6E9, + 0x73E5, 0xE7ED, + 0x73E7, 0xE7F2, + 0x73E9, 0xE7F1, + 0x73ED, 0xB0E0, + 0x73F2, 0xE7F5, + 0x7403, 0xC7F2, + 0x7405, 0xC0C5, + 0x7406, 0xC0ED, + 0x7409, 0xC1F0, + 0x740A, 0xE7F0, + 0x740F, 0xE7F6, + 0x7410, 0xCBF6, + 0x741A, 0xE8A2, + 0x741B, 0xE8A1, + 0x7422, 0xD7C1, + 0x7425, 0xE7FA, + 0x7426, 0xE7F9, + 0x7428, 0xE7FB, + 0x742A, 0xE7F7, + 0x742C, 0xE7FE, + 0x742E, 0xE7FD, + 0x7430, 0xE7FC, + 0x7433, 0xC1D5, + 0x7434, 0xC7D9, + 0x7435, 0xC5FD, + 0x7436, 0xC5C3, + 0x743C, 0xC7ED, + 0x7441, 0xE8A3, + 0x7455, 0xE8A6, + 0x7457, 0xE8A5, + 0x7459, 0xE8A7, + 0x745A, 0xBAF7, + 0x745B, 0xE7F8, + 0x745C, 0xE8A4, + 0x745E, 0xC8F0, + 0x745F, 0xC9AA, + 0x746D, 0xE8A9, + 0x7470, 0xB9E5, + 0x7476, 0xD1FE, + 0x7477, 0xE8A8, + 0x747E, 0xE8AA, + 0x7480, 0xE8AD, + 0x7481, 0xE8AE, + 0x7483, 0xC1A7, + 0x7487, 0xE8AF, + 0x748B, 0xE8B0, + 0x748E, 0xE8AC, + 0x7490, 0xE8B4, + 0x749C, 0xE8AB, + 0x749E, 0xE8B1, + 0x74A7, 0xE8B5, + 0x74A8, 0xE8B2, + 0x74A9, 0xE8B3, + 0x74BA, 0xE8B7, + 0x74D2, 0xE8B6, + 0x74DC, 0xB9CF, + 0x74DE, 0xF0AC, + 0x74E0, 0xF0AD, + 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, + 0x74E4, 0xC8BF, + 0x74E6, 0xCDDF, + 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, + 0x74F4, 0xEAB2, + 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, + 0x74FF, 0xEAB3, + 0x7504, 0xD5E7, + 0x750D, 0xDDF9, + 0x750F, 0xEAB4, + 0x7511, 0xEAB5, + 0x7513, 0xEAB6, + 0x7518, 0xB8CA, + 0x7519, 0xDFB0, + 0x751A, 0xC9F5, + 0x751C, 0xCCF0, + 0x751F, 0xC9FA, + 0x7525, 0xC9FB, + 0x7528, 0xD3C3, + 0x7529, 0xCBA6, + 0x752B, 0xB8A6, + 0x752C, 0xF0AE, + 0x752D, 0xB1C2, + 0x752F, 0xE5B8, + 0x7530, 0xCCEF, + 0x7531, 0xD3C9, + 0x7532, 0xBCD7, + 0x7533, 0xC9EA, + 0x7535, 0xB5E7, + 0x7537, 0xC4D0, + 0x7538, 0xB5E9, + 0x753A, 0xEEAE, + 0x753B, 0xBBAD, + 0x753E, 0xE7DE, + 0x7540, 0xEEAF, + 0x7545, 0xB3A9, + 0x7548, 0xEEB2, + 0x754B, 0xEEB1, + 0x754C, 0xBDE7, + 0x754E, 0xEEB0, + 0x754F, 0xCEB7, + 0x7554, 0xC5CF, + 0x7559, 0xC1F4, + 0x755A, 0xDBCE, + 0x755B, 0xEEB3, + 0x755C, 0xD0F3, + 0x7565, 0xC2D4, + 0x7566, 0xC6E8, + 0x756A, 0xB7AC, + 0x7572, 0xEEB4, + 0x7574, 0xB3EB, + 0x7578, 0xBBFB, + 0x7579, 0xEEB5, + 0x757F, 0xE7DC, + 0x7583, 0xEEB6, + 0x7586, 0xBDAE, + 0x758B, 0xF1E2, + 0x758F, 0xCAE8, + 0x7591, 0xD2C9, + 0x7592, 0xF0DA, + 0x7594, 0xF0DB, + 0x7596, 0xF0DC, + 0x7597, 0xC1C6, + 0x7599, 0xB8ED, + 0x759A, 0xBECE, + 0x759D, 0xF0DE, + 0x759F, 0xC5B1, + 0x75A0, 0xF0DD, + 0x75A1, 0xD1F1, + 0x75A3, 0xF0E0, + 0x75A4, 0xB0CC, + 0x75A5, 0xBDEA, + 0x75AB, 0xD2DF, + 0x75AC, 0xF0DF, + 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, + 0x75B0, 0xF0E6, + 0x75B1, 0xF0E5, + 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, + 0x75B4, 0xF0E2, + 0x75B5, 0xB4C3, + 0x75B8, 0xF0E3, + 0x75B9, 0xD5EE, + 0x75BC, 0xCCDB, + 0x75BD, 0xBED2, + 0x75BE, 0xBCB2, + 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, + 0x75C4, 0xF0E4, + 0x75C5, 0xB2A1, + 0x75C7, 0xD6A2, + 0x75C8, 0xD3B8, + 0x75C9, 0xBEB7, + 0x75CA, 0xC8AC, + 0x75CD, 0xF0EA, + 0x75D2, 0xD1F7, + 0x75D4, 0xD6CC, + 0x75D5, 0xBADB, + 0x75D6, 0xF0E9, + 0x75D8, 0xB6BB, + 0x75DB, 0xCDB4, + 0x75DE, 0xC6A6, + 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, + 0x75E4, 0xF0EE, + 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, + 0x75E8, 0xF0EC, + 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, + 0x75F0, 0xCCB5, + 0x75F1, 0xF0F2, + 0x75F4, 0xB3D5, + 0x75F9, 0xB1D4, + 0x75FC, 0xF0F3, + 0x75FF, 0xF0F4, + 0x7600, 0xF0F6, + 0x7601, 0xB4E1, + 0x7603, 0xF0F1, + 0x7605, 0xF0F7, + 0x760A, 0xF0FA, + 0x760C, 0xF0F8, + 0x7610, 0xF0F5, + 0x7615, 0xF0FD, + 0x7617, 0xF0F9, + 0x7618, 0xF0FC, + 0x7619, 0xF0FE, + 0x761B, 0xF1A1, + 0x761F, 0xCEC1, + 0x7620, 0xF1A4, + 0x7622, 0xF1A3, + 0x7624, 0xC1F6, + 0x7625, 0xF0FB, + 0x7626, 0xCADD, + 0x7629, 0xB4F1, + 0x762A, 0xB1F1, + 0x762B, 0xCCB1, + 0x762D, 0xF1A6, + 0x7630, 0xF1A7, + 0x7633, 0xF1AC, + 0x7634, 0xD5CE, + 0x7635, 0xF1A9, + 0x7638, 0xC8B3, + 0x763C, 0xF1A2, + 0x763E, 0xF1AB, + 0x763F, 0xF1A8, + 0x7640, 0xF1A5, + 0x7643, 0xF1AA, + 0x764C, 0xB0A9, + 0x764D, 0xF1AD, + 0x7654, 0xF1AF, + 0x7656, 0xF1B1, + 0x765C, 0xF1B0, + 0x765E, 0xF1AE, + 0x7663, 0xD1A2, + 0x766B, 0xF1B2, + 0x766F, 0xF1B3, + 0x7678, 0xB9EF, + 0x767B, 0xB5C7, + 0x767D, 0xB0D7, + 0x767E, 0xB0D9, + 0x7682, 0xD4ED, + 0x7684, 0xB5C4, + 0x7686, 0xBDD4, + 0x7687, 0xBBCA, + 0x7688, 0xF0A7, + 0x768B, 0xB8DE, + 0x768E, 0xF0A8, + 0x7691, 0xB0A8, + 0x7693, 0xF0A9, + 0x7696, 0xCDEE, + 0x7699, 0xF0AA, + 0x76A4, 0xF0AB, + 0x76AE, 0xC6A4, + 0x76B1, 0xD6E5, + 0x76B2, 0xF1E4, + 0x76B4, 0xF1E5, + 0x76BF, 0xC3F3, + 0x76C2, 0xD3DB, + 0x76C5, 0xD6D1, + 0x76C6, 0xC5E8, + 0x76C8, 0xD3AF, + 0x76CA, 0xD2E6, + 0x76CD, 0xEEC1, + 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, + 0x76D0, 0xD1CE, + 0x76D1, 0xBCE0, + 0x76D2, 0xBAD0, + 0x76D4, 0xBFF8, + 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, + 0x76D8, 0xC5CC, + 0x76DB, 0xCAA2, + 0x76DF, 0xC3CB, + 0x76E5, 0xEEC2, + 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, + 0x76F1, 0xEDEC, + 0x76F2, 0xC3A4, + 0x76F4, 0xD6B1, + 0x76F8, 0xCFE0, + 0x76F9, 0xEDEF, + 0x76FC, 0xC5CE, + 0x76FE, 0xB6DC, + 0x7701, 0xCAA1, + 0x7704, 0xEDED, + 0x7707, 0xEDF0, + 0x7708, 0xEDF1, + 0x7709, 0xC3BC, + 0x770B, 0xBFB4, + 0x770D, 0xEDEE, + 0x7719, 0xEDF4, + 0x771A, 0xEDF2, + 0x771F, 0xD5E6, + 0x7720, 0xC3DF, + 0x7722, 0xEDF3, + 0x7726, 0xEDF6, + 0x7728, 0xD5A3, + 0x7729, 0xD1A3, + 0x772D, 0xEDF5, + 0x772F, 0xC3D0, + 0x7735, 0xEDF7, + 0x7736, 0xBFF4, + 0x7737, 0xBEEC, + 0x7738, 0xEDF8, + 0x773A, 0xCCF7, + 0x773C, 0xD1DB, + 0x7740, 0xD7C5, + 0x7741, 0xD5F6, + 0x7743, 0xEDFC, + 0x7747, 0xEDFB, + 0x7750, 0xEDF9, + 0x7751, 0xEDFA, + 0x775A, 0xEDFD, + 0x775B, 0xBEA6, + 0x7761, 0xCBAF, + 0x7762, 0xEEA1, + 0x7763, 0xB6BD, + 0x7765, 0xEEA2, + 0x7766, 0xC4C0, + 0x7768, 0xEDFE, + 0x776B, 0xBDDE, + 0x776C, 0xB2C7, + 0x7779, 0xB6C3, + 0x777D, 0xEEA5, + 0x777E, 0xD8BA, + 0x777F, 0xEEA3, + 0x7780, 0xEEA6, + 0x7784, 0xC3E9, + 0x7785, 0xB3F2, + 0x778C, 0xEEA7, + 0x778D, 0xEEA4, + 0x778E, 0xCFB9, + 0x7791, 0xEEA8, + 0x7792, 0xC2F7, + 0x779F, 0xEEA9, + 0x77A0, 0xEEAA, + 0x77A2, 0xDEAB, + 0x77A5, 0xC6B3, + 0x77A7, 0xC7C6, + 0x77A9, 0xD6F5, + 0x77AA, 0xB5C9, + 0x77AC, 0xCBB2, + 0x77B0, 0xEEAB, + 0x77B3, 0xCDAB, + 0x77B5, 0xEEAC, + 0x77BB, 0xD5B0, + 0x77BD, 0xEEAD, + 0x77BF, 0xF6C4, + 0x77CD, 0xDBC7, + 0x77D7, 0xB4A3, + 0x77DB, 0xC3AC, + 0x77DC, 0xF1E6, + 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, + 0x77E5, 0xD6AA, + 0x77E7, 0xEFF2, + 0x77E9, 0xBED8, + 0x77EB, 0xBDC3, + 0x77EC, 0xEFF3, + 0x77ED, 0xB6CC, + 0x77EE, 0xB0AB, + 0x77F3, 0xCAAF, + 0x77F6, 0xEDB6, + 0x77F8, 0xEDB7, + 0x77FD, 0xCEF9, + 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, + 0x7800, 0xEDB8, + 0x7801, 0xC2EB, + 0x7802, 0xC9B0, + 0x7809, 0xEDB9, + 0x780C, 0xC6F6, + 0x780D, 0xBFB3, + 0x7811, 0xEDBC, + 0x7812, 0xC5F8, + 0x7814, 0xD1D0, + 0x7816, 0xD7A9, + 0x7817, 0xEDBA, + 0x7818, 0xEDBB, + 0x781A, 0xD1E2, + 0x781C, 0xEDBF, + 0x781D, 0xEDC0, + 0x781F, 0xEDC4, + 0x7823, 0xEDC8, + 0x7825, 0xEDC6, + 0x7826, 0xEDCE, + 0x7827, 0xD5E8, + 0x7829, 0xEDC9, + 0x782C, 0xEDC7, + 0x782D, 0xEDBE, + 0x7830, 0xC5E9, + 0x7834, 0xC6C6, + 0x7837, 0xC9E9, + 0x7838, 0xD4D2, + 0x7839, 0xEDC1, + 0x783A, 0xEDC2, + 0x783B, 0xEDC3, + 0x783C, 0xEDC5, + 0x783E, 0xC0F9, + 0x7840, 0xB4A1, + 0x7845, 0xB9E8, + 0x7847, 0xEDD0, + 0x784C, 0xEDD1, + 0x784E, 0xEDCA, + 0x7850, 0xEDCF, + 0x7852, 0xCEF8, + 0x7855, 0xCBB6, + 0x7856, 0xEDCC, + 0x7857, 0xEDCD, + 0x785D, 0xCFF5, + 0x786A, 0xEDD2, + 0x786B, 0xC1F2, + 0x786C, 0xD3B2, + 0x786D, 0xEDCB, + 0x786E, 0xC8B7, + 0x7877, 0xBCEF, + 0x787C, 0xC5F0, + 0x7887, 0xEDD6, + 0x7889, 0xB5EF, + 0x788C, 0xC2B5, + 0x788D, 0xB0AD, + 0x788E, 0xCBE9, + 0x7891, 0xB1AE, + 0x7893, 0xEDD4, + 0x7897, 0xCDEB, + 0x7898, 0xB5E2, + 0x789A, 0xEDD5, + 0x789B, 0xEDD3, + 0x789C, 0xEDD7, + 0x789F, 0xB5FA, + 0x78A1, 0xEDD8, + 0x78A3, 0xEDD9, + 0x78A5, 0xEDDC, + 0x78A7, 0xB1CC, + 0x78B0, 0xC5F6, + 0x78B1, 0xBCEE, + 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, + 0x78B4, 0xB2EA, + 0x78B9, 0xEDDB, + 0x78BE, 0xC4EB, + 0x78C1, 0xB4C5, + 0x78C5, 0xB0F5, + 0x78C9, 0xEDDF, + 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, + 0x78D0, 0xC5CD, + 0x78D4, 0xEDDD, + 0x78D5, 0xBFC4, + 0x78D9, 0xEDDE, + 0x78E8, 0xC4A5, + 0x78EC, 0xEDE0, + 0x78F2, 0xEDE1, + 0x78F4, 0xEDE3, + 0x78F7, 0xC1D7, + 0x78FA, 0xBBC7, + 0x7901, 0xBDB8, + 0x7905, 0xEDE2, + 0x7913, 0xEDE4, + 0x791E, 0xEDE6, + 0x7924, 0xEDE5, + 0x7934, 0xEDE7, + 0x793A, 0xCABE, + 0x793B, 0xECEA, + 0x793C, 0xC0F1, + 0x793E, 0xC9E7, + 0x7940, 0xECEB, + 0x7941, 0xC6EE, + 0x7946, 0xECEC, + 0x7948, 0xC6ED, + 0x7949, 0xECED, + 0x7953, 0xECF0, + 0x7956, 0xD7E6, + 0x7957, 0xECF3, + 0x795A, 0xECF1, + 0x795B, 0xECEE, + 0x795C, 0xECEF, + 0x795D, 0xD7A3, + 0x795E, 0xC9F1, + 0x795F, 0xCBEE, + 0x7960, 0xECF4, + 0x7962, 0xECF2, + 0x7965, 0xCFE9, + 0x7967, 0xECF6, + 0x7968, 0xC6B1, + 0x796D, 0xBCC0, + 0x796F, 0xECF5, + 0x7977, 0xB5BB, + 0x7978, 0xBBF6, + 0x797A, 0xECF7, + 0x7980, 0xD9F7, + 0x7981, 0xBDFB, + 0x7984, 0xC2BB, + 0x7985, 0xECF8, + 0x798A, 0xECF9, + 0x798F, 0xB8A3, + 0x799A, 0xECFA, + 0x79A7, 0xECFB, + 0x79B3, 0xECFC, + 0x79B9, 0xD3ED, + 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, + 0x79BD, 0xC7DD, + 0x79BE, 0xBACC, + 0x79C0, 0xD0E3, + 0x79C1, 0xCBBD, + 0x79C3, 0xCDBA, + 0x79C6, 0xB8D1, + 0x79C9, 0xB1FC, + 0x79CB, 0xC7EF, + 0x79CD, 0xD6D6, + 0x79D1, 0xBFC6, + 0x79D2, 0xC3EB, + 0x79D5, 0xEFF5, + 0x79D8, 0xC3D8, + 0x79DF, 0xD7E2, + 0x79E3, 0xEFF7, + 0x79E4, 0xB3D3, + 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, + 0x79E9, 0xD6C8, + 0x79EB, 0xEFF8, + 0x79ED, 0xEFF6, + 0x79EF, 0xBBFD, + 0x79F0, 0xB3C6, + 0x79F8, 0xBDD5, + 0x79FB, 0xD2C6, + 0x79FD, 0xBBE0, + 0x7A00, 0xCFA1, + 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, + 0x7A06, 0xEFF9, + 0x7A0B, 0xB3CC, + 0x7A0D, 0xC9D4, + 0x7A0E, 0xCBB0, + 0x7A14, 0xEFFE, + 0x7A17, 0xB0DE, + 0x7A1A, 0xD6C9, + 0x7A1E, 0xEFFD, + 0x7A20, 0xB3ED, + 0x7A23, 0xF6D5, + 0x7A33, 0xCEC8, + 0x7A37, 0xF0A2, + 0x7A39, 0xF0A1, + 0x7A3B, 0xB5BE, + 0x7A3C, 0xBCDA, + 0x7A3D, 0xBBFC, + 0x7A3F, 0xB8E5, + 0x7A46, 0xC4C2, + 0x7A51, 0xF0A3, + 0x7A57, 0xCBEB, + 0x7A70, 0xF0A6, + 0x7A74, 0xD1A8, + 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, + 0x7A78, 0xF1B6, + 0x7A79, 0xF1B7, + 0x7A7A, 0xBFD5, + 0x7A7F, 0xB4A9, + 0x7A80, 0xF1B8, + 0x7A81, 0xCDBB, + 0x7A83, 0xC7D4, + 0x7A84, 0xD5AD, + 0x7A86, 0xF1B9, + 0x7A88, 0xF1BA, + 0x7A8D, 0xC7CF, + 0x7A91, 0xD2A4, + 0x7A92, 0xD6CF, + 0x7A95, 0xF1BB, + 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, + 0x7A98, 0xBEBD, + 0x7A9C, 0xB4DC, + 0x7A9D, 0xCED1, + 0x7A9F, 0xBFDF, + 0x7AA0, 0xF1BD, + 0x7AA5, 0xBFFA, + 0x7AA6, 0xF1BC, + 0x7AA8, 0xF1BF, + 0x7AAC, 0xF1BE, + 0x7AAD, 0xF1C0, + 0x7AB3, 0xF1C1, + 0x7ABF, 0xC1FE, + 0x7ACB, 0xC1A2, + 0x7AD6, 0xCAFA, + 0x7AD9, 0xD5BE, + 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, + 0x7AE0, 0xD5C2, + 0x7AE3, 0xBFA2, + 0x7AE5, 0xCDAF, + 0x7AE6, 0xF1B5, + 0x7AED, 0xBDDF, + 0x7AEF, 0xB6CB, + 0x7AF9, 0xD6F1, + 0x7AFA, 0xF3C3, + 0x7AFD, 0xF3C4, + 0x7AFF, 0xB8CD, + 0x7B03, 0xF3C6, + 0x7B04, 0xF3C7, + 0x7B06, 0xB0CA, + 0x7B08, 0xF3C5, + 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, + 0x7B0F, 0xF3CB, + 0x7B11, 0xD0A6, + 0x7B14, 0xB1CA, + 0x7B15, 0xF3C8, + 0x7B19, 0xF3CF, + 0x7B1B, 0xB5D1, + 0x7B1E, 0xF3D7, + 0x7B20, 0xF3D2, + 0x7B24, 0xF3D4, + 0x7B25, 0xF3D3, + 0x7B26, 0xB7FB, + 0x7B28, 0xB1BF, + 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, + 0x7B2C, 0xB5DA, + 0x7B2E, 0xF3D0, + 0x7B31, 0xF3D1, + 0x7B33, 0xF3D5, + 0x7B38, 0xF3CD, + 0x7B3A, 0xBCE3, + 0x7B3C, 0xC1FD, + 0x7B3E, 0xF3D6, + 0x7B45, 0xF3DA, + 0x7B47, 0xF3CC, + 0x7B49, 0xB5C8, + 0x7B4B, 0xBDEE, + 0x7B4C, 0xF3DC, + 0x7B4F, 0xB7A4, + 0x7B50, 0xBFF0, + 0x7B51, 0xD6FE, + 0x7B52, 0xCDB2, + 0x7B54, 0xB4F0, + 0x7B56, 0xB2DF, + 0x7B58, 0xF3D8, + 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, + 0x7B5D, 0xF3DD, + 0x7B60, 0xF3DE, + 0x7B62, 0xF3E1, + 0x7B6E, 0xF3DF, + 0x7B71, 0xF3E3, + 0x7B72, 0xF3E2, + 0x7B75, 0xF3DB, + 0x7B77, 0xBFEA, + 0x7B79, 0xB3EF, + 0x7B7B, 0xF3E0, + 0x7B7E, 0xC7A9, + 0x7B80, 0xBCF2, + 0x7B85, 0xF3EB, + 0x7B8D, 0xB9BF, + 0x7B90, 0xF3E4, + 0x7B94, 0xB2AD, + 0x7B95, 0xBBFE, + 0x7B97, 0xCBE3, + 0x7B9C, 0xF3ED, + 0x7B9D, 0xF3E9, + 0x7BA1, 0xB9DC, + 0x7BA2, 0xF3EE, + 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, + 0x7BA8, 0xF3EA, + 0x7BA9, 0xC2E1, + 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, + 0x7BAC, 0xF3E8, + 0x7BAD, 0xBCFD, + 0x7BB1, 0xCFE4, + 0x7BB4, 0xF3F0, + 0x7BB8, 0xF3E7, + 0x7BC1, 0xF3F2, + 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, + 0x7BCC, 0xF3F3, + 0x7BD1, 0xF3F1, + 0x7BD3, 0xC2A8, + 0x7BD9, 0xB8DD, + 0x7BDA, 0xF3F5, + 0x7BDD, 0xF3F4, + 0x7BE1, 0xB4DB, + 0x7BE5, 0xF3F6, + 0x7BE6, 0xF3F7, + 0x7BEA, 0xF3F8, + 0x7BEE, 0xC0BA, + 0x7BF1, 0xC0E9, + 0x7BF7, 0xC5F1, + 0x7BFC, 0xF3FB, + 0x7BFE, 0xF3FA, + 0x7C07, 0xB4D8, + 0x7C0B, 0xF3FE, + 0x7C0C, 0xF3F9, + 0x7C0F, 0xF3FC, + 0x7C16, 0xF3FD, + 0x7C1F, 0xF4A1, + 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, + 0x7C2A, 0xF4A2, + 0x7C38, 0xF4A4, + 0x7C3F, 0xB2BE, + 0x7C40, 0xF4A6, + 0x7C41, 0xF4A5, + 0x7C4D, 0xBCAE, + 0x7C73, 0xC3D7, + 0x7C74, 0xD9E1, + 0x7C7B, 0xC0E0, + 0x7C7C, 0xF4CC, + 0x7C7D, 0xD7D1, + 0x7C89, 0xB7DB, + 0x7C91, 0xF4CE, + 0x7C92, 0xC1A3, + 0x7C95, 0xC6C9, + 0x7C97, 0xB4D6, + 0x7C98, 0xD5B3, + 0x7C9C, 0xF4D0, + 0x7C9D, 0xF4CF, + 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, + 0x7CA2, 0xF4D2, + 0x7CA4, 0xD4C1, + 0x7CA5, 0xD6E0, + 0x7CAA, 0xB7E0, + 0x7CAE, 0xC1B8, + 0x7CB1, 0xC1BB, + 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, + 0x7CB9, 0xB4E2, + 0x7CBC, 0xF4D4, + 0x7CBD, 0xF4D5, + 0x7CBE, 0xBEAB, + 0x7CC1, 0xF4D6, + 0x7CC5, 0xF4DB, + 0x7CC7, 0xF4D7, + 0x7CC8, 0xF4DA, + 0x7CCA, 0xBAFD, + 0x7CCC, 0xF4D8, + 0x7CCD, 0xF4D9, + 0x7CD5, 0xB8E2, + 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, + 0x7CD9, 0xB2DA, + 0x7CDC, 0xC3D3, + 0x7CDF, 0xD4E3, + 0x7CE0, 0xBFB7, + 0x7CE8, 0xF4DD, + 0x7CEF, 0xC5B4, + 0x7CF8, 0xF4E9, + 0x7CFB, 0xCFB5, + 0x7D0A, 0xCEC9, + 0x7D20, 0xCBD8, + 0x7D22, 0xCBF7, + 0x7D27, 0xBDF4, + 0x7D2B, 0xD7CF, + 0x7D2F, 0xC0DB, + 0x7D6E, 0xD0F5, + 0x7D77, 0xF4EA, + 0x7DA6, 0xF4EB, + 0x7DAE, 0xF4EC, + 0x7E3B, 0xF7E3, + 0x7E41, 0xB7B1, + 0x7E47, 0xF4ED, + 0x7E82, 0xD7EB, + 0x7E9B, 0xF4EE, + 0x7E9F, 0xE6F9, + 0x7EA0, 0xBEC0, + 0x7EA1, 0xE6FA, + 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, + 0x7EA4, 0xCFCB, + 0x7EA5, 0xE6FC, + 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, + 0x7EA8, 0xE6FD, + 0x7EA9, 0xE6FE, + 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, + 0x7EAC, 0xCEB3, + 0x7EAD, 0xE7A1, + 0x7EAF, 0xB4BF, + 0x7EB0, 0xE7A2, + 0x7EB1, 0xC9B4, + 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, + 0x7EB5, 0xD7DD, + 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, + 0x7EB8, 0xD6BD, + 0x7EB9, 0xCEC6, + 0x7EBA, 0xB7C4, + 0x7EBD, 0xC5A6, + 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, + 0x7EC0, 0xE7A4, + 0x7EC1, 0xE7A5, + 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, + 0x7EC4, 0xD7E9, + 0x7EC5, 0xC9F0, + 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, + 0x7EC8, 0xD6D5, + 0x7EC9, 0xE7A7, + 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, + 0x7ECC, 0xE7A9, + 0x7ECD, 0xC9DC, + 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, + 0x7ED0, 0xE7AA, + 0x7ED1, 0xB0F3, + 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, + 0x7ED4, 0xE7AB, + 0x7ED5, 0xC8C6, + 0x7ED7, 0xE7AC, + 0x7ED8, 0xBBE6, + 0x7ED9, 0xB8F8, + 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, + 0x7EDC, 0xC2E7, + 0x7EDD, 0xBEF8, + 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, + 0x7EE0, 0xE7AE, + 0x7EE1, 0xE7AF, + 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, + 0x7EE5, 0xCBE7, + 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, + 0x7EE8, 0xE7B0, + 0x7EE9, 0xBCA8, + 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, + 0x7EED, 0xD0F8, + 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, + 0x7EF0, 0xB4C2, + 0x7EF1, 0xE7B4, + 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, + 0x7EF4, 0xCEAC, + 0x7EF5, 0xC3E0, + 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, + 0x7EF8, 0xB3F1, + 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, + 0x7EFC, 0xD7DB, + 0x7EFD, 0xD5C0, + 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, + 0x7F00, 0xD7BA, + 0x7F01, 0xE7BB, + 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, + 0x7F04, 0xBCEA, + 0x7F05, 0xC3E5, + 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, + 0x7F08, 0xE7BF, + 0x7F09, 0xBCA9, + 0x7F0B, 0xE7C0, + 0x7F0C, 0xE7C1, + 0x7F0D, 0xE7B6, + 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, + 0x7F11, 0xE7C3, + 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, + 0x7F14, 0xB5DE, + 0x7F15, 0xC2C6, + 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, + 0x7F18, 0xD4B5, + 0x7F19, 0xE7C6, + 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, + 0x7F1C, 0xE7C7, + 0x7F1D, 0xB7EC, + 0x7F1F, 0xE7C9, + 0x7F20, 0xB2F8, + 0x7F21, 0xE7CA, + 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, + 0x7F24, 0xE7CD, + 0x7F25, 0xE7CE, + 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, + 0x7F28, 0xD3A7, + 0x7F29, 0xCBF5, + 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, + 0x7F2C, 0xE7D3, + 0x7F2D, 0xE7D4, + 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, + 0x7F30, 0xE7D6, + 0x7F31, 0xE7D7, + 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, + 0x7F34, 0xBDC9, + 0x7F35, 0xE7DA, + 0x7F36, 0xF3BE, + 0x7F38, 0xB8D7, + 0x7F3A, 0xC8B1, + 0x7F42, 0xF3BF, + 0x7F44, 0xF3C0, + 0x7F45, 0xF3C1, + 0x7F50, 0xB9DE, + 0x7F51, 0xCDF8, + 0x7F54, 0xD8E8, + 0x7F55, 0xBAB1, + 0x7F57, 0xC2DE, + 0x7F58, 0xEEB7, + 0x7F5A, 0xB7A3, + 0x7F5F, 0xEEB9, + 0x7F61, 0xEEB8, + 0x7F62, 0xB0D5, + 0x7F68, 0xEEBB, + 0x7F69, 0xD5D6, + 0x7F6A, 0xD7EF, + 0x7F6E, 0xD6C3, + 0x7F71, 0xEEBD, + 0x7F72, 0xCAF0, + 0x7F74, 0xEEBC, + 0x7F79, 0xEEBE, + 0x7F7E, 0xEEC0, + 0x7F81, 0xEEBF, + 0x7F8A, 0xD1F2, + 0x7F8C, 0xC7BC, + 0x7F8E, 0xC3C0, + 0x7F94, 0xB8E1, + 0x7F9A, 0xC1E7, + 0x7F9D, 0xF4C6, + 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, + 0x7FA1, 0xCFDB, + 0x7FA4, 0xC8BA, + 0x7FA7, 0xF4C8, + 0x7FAF, 0xF4C9, + 0x7FB0, 0xF4CA, + 0x7FB2, 0xF4CB, + 0x7FB8, 0xD9FA, + 0x7FB9, 0xB8FE, + 0x7FBC, 0xE5F1, + 0x7FBD, 0xD3F0, + 0x7FBF, 0xF4E0, + 0x7FC1, 0xCECC, + 0x7FC5, 0xB3E1, + 0x7FCA, 0xF1B4, + 0x7FCC, 0xD2EE, + 0x7FCE, 0xF4E1, + 0x7FD4, 0xCFE8, + 0x7FD5, 0xF4E2, + 0x7FD8, 0xC7CC, + 0x7FDF, 0xB5D4, + 0x7FE0, 0xB4E4, + 0x7FE1, 0xF4E4, + 0x7FE5, 0xF4E3, + 0x7FE6, 0xF4E5, + 0x7FE9, 0xF4E6, + 0x7FEE, 0xF4E7, + 0x7FF0, 0xBAB2, + 0x7FF1, 0xB0BF, + 0x7FF3, 0xF4E8, + 0x7FFB, 0xB7AD, + 0x7FFC, 0xD2ED, + 0x8000, 0xD2AB, + 0x8001, 0xC0CF, + 0x8003, 0xBFBC, + 0x8004, 0xEBA3, + 0x8005, 0xD5DF, + 0x8006, 0xEAC8, + 0x800B, 0xF1F3, + 0x800C, 0xB6F8, + 0x800D, 0xCBA3, + 0x8010, 0xC4CD, + 0x8012, 0xF1E7, + 0x8014, 0xF1E8, + 0x8015, 0xB8FB, + 0x8016, 0xF1E9, + 0x8017, 0xBAC4, + 0x8018, 0xD4C5, + 0x8019, 0xB0D2, + 0x801C, 0xF1EA, + 0x8020, 0xF1EB, + 0x8022, 0xF1EC, + 0x8025, 0xF1ED, + 0x8026, 0xF1EE, + 0x8027, 0xF1EF, + 0x8028, 0xF1F1, + 0x8029, 0xF1F0, + 0x802A, 0xC5D5, + 0x8031, 0xF1F2, + 0x8033, 0xB6FA, + 0x8035, 0xF1F4, + 0x8036, 0xD2AE, + 0x8037, 0xDEC7, + 0x8038, 0xCBCA, + 0x803B, 0xB3DC, + 0x803D, 0xB5A2, + 0x803F, 0xB9A2, + 0x8042, 0xC4F4, + 0x8043, 0xF1F5, + 0x8046, 0xF1F6, + 0x804A, 0xC1C4, + 0x804B, 0xC1FB, + 0x804C, 0xD6B0, + 0x804D, 0xF1F7, + 0x8052, 0xF1F8, + 0x8054, 0xC1AA, + 0x8058, 0xC6B8, + 0x805A, 0xBEDB, + 0x8069, 0xF1F9, + 0x806A, 0xB4CF, + 0x8071, 0xF1FA, + 0x807F, 0xEDB2, + 0x8080, 0xEDB1, + 0x8083, 0xCBE0, + 0x8084, 0xD2DE, + 0x8086, 0xCBC1, + 0x8087, 0xD5D8, + 0x8089, 0xC8E2, + 0x808B, 0xC0DF, + 0x808C, 0xBCA1, + 0x8093, 0xEBC1, + 0x8096, 0xD0A4, + 0x8098, 0xD6E2, + 0x809A, 0xB6C7, + 0x809B, 0xB8D8, + 0x809C, 0xEBC0, + 0x809D, 0xB8CE, + 0x809F, 0xEBBF, + 0x80A0, 0xB3A6, + 0x80A1, 0xB9C9, + 0x80A2, 0xD6AB, + 0x80A4, 0xB7F4, + 0x80A5, 0xB7CA, + 0x80A9, 0xBCE7, + 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, + 0x80AD, 0xEBC7, + 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, + 0x80B1, 0xEBC5, + 0x80B2, 0xD3FD, + 0x80B4, 0xEBC8, + 0x80B7, 0xEBC9, + 0x80BA, 0xB7CE, + 0x80BC, 0xEBC2, + 0x80BD, 0xEBC4, + 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, + 0x80C0, 0xD5CD, + 0x80C1, 0xD0B2, + 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, + 0x80C4, 0xEBD0, + 0x80C6, 0xB5A8, + 0x80CC, 0xB1B3, + 0x80CD, 0xEBD2, + 0x80CE, 0xCCA5, + 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, + 0x80D9, 0xEBD1, + 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, + 0x80DC, 0xCAA4, + 0x80DD, 0xEBD5, + 0x80DE, 0xB0FB, + 0x80E1, 0xBAFA, + 0x80E4, 0xD8B7, + 0x80E5, 0xF1E3, + 0x80E7, 0xEBCA, + 0x80E8, 0xEBCB, + 0x80E9, 0xEBCC, + 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, + 0x80EC, 0xE6C0, + 0x80ED, 0xEBD9, + 0x80EF, 0xBFE8, + 0x80F0, 0xD2C8, + 0x80F1, 0xEBD7, + 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, + 0x80F4, 0xEBD8, + 0x80F6, 0xBDBA, + 0x80F8, 0xD0D8, + 0x80FA, 0xB0B7, + 0x80FC, 0xEBDD, + 0x80FD, 0xC4DC, + 0x8102, 0xD6AC, + 0x8106, 0xB4E0, + 0x8109, 0xC2F6, + 0x810A, 0xBCB9, + 0x810D, 0xEBDA, + 0x810E, 0xEBDB, + 0x810F, 0xD4E0, + 0x8110, 0xC6EA, + 0x8111, 0xC4D4, + 0x8112, 0xEBDF, + 0x8113, 0xC5A7, + 0x8114, 0xD9F5, + 0x8116, 0xB2B1, + 0x8118, 0xEBE4, + 0x811A, 0xBDC5, + 0x811E, 0xEBE2, + 0x812C, 0xEBE3, + 0x812F, 0xB8AC, + 0x8131, 0xCDD1, + 0x8132, 0xEBE5, + 0x8136, 0xEBE1, + 0x8138, 0xC1B3, + 0x813E, 0xC6A2, + 0x8146, 0xCCF3, + 0x8148, 0xEBE6, + 0x814A, 0xC0B0, + 0x814B, 0xD2B8, + 0x814C, 0xEBE7, + 0x8150, 0xB8AF, + 0x8151, 0xB8AD, + 0x8153, 0xEBE8, + 0x8154, 0xC7BB, + 0x8155, 0xCDF3, + 0x8159, 0xEBEA, + 0x815A, 0xEBEB, + 0x8160, 0xEBED, + 0x8165, 0xD0C8, + 0x8167, 0xEBF2, + 0x8169, 0xEBEE, + 0x816D, 0xEBF1, + 0x816E, 0xC8F9, + 0x8170, 0xD1FC, + 0x8171, 0xEBEC, + 0x8174, 0xEBE9, + 0x8179, 0xB8B9, + 0x817A, 0xCFD9, + 0x817B, 0xC4E5, + 0x817C, 0xEBEF, + 0x817D, 0xEBF0, + 0x817E, 0xCCDA, + 0x817F, 0xCDC8, + 0x8180, 0xB0F2, + 0x8182, 0xEBF6, + 0x8188, 0xEBF5, + 0x818A, 0xB2B2, + 0x818F, 0xB8E0, + 0x8191, 0xEBF7, + 0x8198, 0xB1EC, + 0x819B, 0xCCC5, + 0x819C, 0xC4A4, + 0x819D, 0xCFA5, + 0x81A3, 0xEBF9, + 0x81A6, 0xECA2, + 0x81A8, 0xC5F2, + 0x81AA, 0xEBFA, + 0x81B3, 0xC9C5, + 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, + 0x81C0, 0xCDCE, + 0x81C1, 0xECA1, + 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, + 0x81C6, 0xD2DC, + 0x81CA, 0xEBFD, + 0x81CC, 0xEBFB, + 0x81E3, 0xB3BC, + 0x81E7, 0xEAB0, + 0x81EA, 0xD7D4, + 0x81EC, 0xF4AB, + 0x81ED, 0xB3F4, + 0x81F3, 0xD6C1, + 0x81F4, 0xD6C2, + 0x81FB, 0xD5E9, + 0x81FC, 0xBECA, + 0x81FE, 0xF4A7, + 0x8200, 0xD2A8, + 0x8201, 0xF4A8, + 0x8202, 0xF4A9, + 0x8204, 0xF4AA, + 0x8205, 0xBECB, + 0x8206, 0xD3DF, + 0x820C, 0xC9E0, + 0x820D, 0xC9E1, + 0x8210, 0xF3C2, + 0x8212, 0xCAE6, + 0x8214, 0xCCF2, + 0x821B, 0xE2B6, + 0x821C, 0xCBB4, + 0x821E, 0xCEE8, + 0x821F, 0xD6DB, + 0x8221, 0xF4AD, + 0x8222, 0xF4AE, + 0x8223, 0xF4AF, + 0x8228, 0xF4B2, + 0x822A, 0xBABD, + 0x822B, 0xF4B3, + 0x822C, 0xB0E3, + 0x822D, 0xF4B0, + 0x822F, 0xF4B1, + 0x8230, 0xBDA2, + 0x8231, 0xB2D5, + 0x8233, 0xF4B6, + 0x8234, 0xF4B7, + 0x8235, 0xB6E6, + 0x8236, 0xB2B0, + 0x8237, 0xCFCF, + 0x8238, 0xF4B4, + 0x8239, 0xB4AC, + 0x823B, 0xF4B5, + 0x823E, 0xF4B8, + 0x8244, 0xF4B9, + 0x8247, 0xCDA7, + 0x8249, 0xF4BA, + 0x824B, 0xF4BB, + 0x824F, 0xF4BC, + 0x8258, 0xCBD2, + 0x825A, 0xF4BD, + 0x825F, 0xF4BE, + 0x8268, 0xF4BF, + 0x826E, 0xF4DE, + 0x826F, 0xC1BC, + 0x8270, 0xBCE8, + 0x8272, 0xC9AB, + 0x8273, 0xD1DE, + 0x8274, 0xE5F5, + 0x8279, 0xDCB3, + 0x827A, 0xD2D5, + 0x827D, 0xDCB4, + 0x827E, 0xB0AC, + 0x827F, 0xDCB5, + 0x8282, 0xBDDA, + 0x8284, 0xDCB9, + 0x8288, 0xD8C2, + 0x828A, 0xDCB7, + 0x828B, 0xD3F3, + 0x828D, 0xC9D6, + 0x828E, 0xDCBA, + 0x828F, 0xDCB6, + 0x8291, 0xDCBB, + 0x8292, 0xC3A2, + 0x8297, 0xDCBC, + 0x8298, 0xDCC5, + 0x8299, 0xDCBD, + 0x829C, 0xCEDF, + 0x829D, 0xD6A5, + 0x829F, 0xDCCF, + 0x82A1, 0xDCCD, + 0x82A4, 0xDCD2, + 0x82A5, 0xBDE6, + 0x82A6, 0xC2AB, + 0x82A8, 0xDCB8, + 0x82A9, 0xDCCB, + 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, + 0x82AC, 0xB7D2, + 0x82AD, 0xB0C5, + 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, + 0x82B0, 0xDCC1, + 0x82B1, 0xBBA8, + 0x82B3, 0xB7BC, + 0x82B4, 0xDCCC, + 0x82B7, 0xDCC6, + 0x82B8, 0xDCBF, + 0x82B9, 0xC7DB, + 0x82BD, 0xD1BF, + 0x82BE, 0xDCC0, + 0x82C1, 0xDCCA, + 0x82C4, 0xDCD0, + 0x82C7, 0xCEAD, + 0x82C8, 0xDCC2, + 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, + 0x82CC, 0xDCC9, + 0x82CD, 0xB2D4, + 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, + 0x82D1, 0xD4B7, + 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, + 0x82D4, 0xCCA6, + 0x82D5, 0xDCE6, + 0x82D7, 0xC3E7, + 0x82D8, 0xDCDC, + 0x82DB, 0xBFC1, + 0x82DC, 0xDCD9, + 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, + 0x82E0, 0xDCE5, + 0x82E1, 0xDCD3, + 0x82E3, 0xDCC4, + 0x82E4, 0xDCD6, + 0x82E5, 0xC8F4, + 0x82E6, 0xBFE0, + 0x82EB, 0xC9BB, + 0x82EF, 0xB1BD, + 0x82F1, 0xD3A2, + 0x82F4, 0xDCDA, + 0x82F7, 0xDCD5, + 0x82F9, 0xC6BB, + 0x82FB, 0xDCDE, + 0x8301, 0xD7C2, + 0x8302, 0xC3AF, + 0x8303, 0xB7B6, + 0x8304, 0xC7D1, + 0x8305, 0xC3A9, + 0x8306, 0xDCE2, + 0x8307, 0xDCD8, + 0x8308, 0xDCEB, + 0x8309, 0xDCD4, + 0x830C, 0xDCDD, + 0x830E, 0xBEA5, + 0x830F, 0xDCD7, + 0x8311, 0xDCE0, + 0x8314, 0xDCE3, + 0x8315, 0xDCE4, + 0x8317, 0xDCF8, + 0x831A, 0xDCE1, + 0x831B, 0xDDA2, + 0x831C, 0xDCE7, + 0x8327, 0xBCEB, + 0x8328, 0xB4C4, + 0x832B, 0xC3A3, + 0x832C, 0xB2E7, + 0x832D, 0xDCFA, + 0x832F, 0xDCF2, + 0x8331, 0xDCEF, + 0x8333, 0xDCFC, + 0x8334, 0xDCEE, + 0x8335, 0xD2F0, + 0x8336, 0xB2E8, + 0x8338, 0xC8D7, + 0x8339, 0xC8E3, + 0x833A, 0xDCFB, + 0x833C, 0xDCED, + 0x8340, 0xDCF7, + 0x8343, 0xDCF5, + 0x8346, 0xBEA3, + 0x8347, 0xDCF4, + 0x8349, 0xB2DD, + 0x834F, 0xDCF3, + 0x8350, 0xBCF6, + 0x8351, 0xDCE8, + 0x8352, 0xBBC4, + 0x8354, 0xC0F3, + 0x835A, 0xBCD4, + 0x835B, 0xDCE9, + 0x835C, 0xDCEA, + 0x835E, 0xDCF1, + 0x835F, 0xDCF6, + 0x8360, 0xDCF9, + 0x8361, 0xB5B4, + 0x8363, 0xC8D9, + 0x8364, 0xBBE7, + 0x8365, 0xDCFE, + 0x8366, 0xDCFD, + 0x8367, 0xD3AB, + 0x8368, 0xDDA1, + 0x8369, 0xDDA3, + 0x836A, 0xDDA5, + 0x836B, 0xD2F1, + 0x836C, 0xDDA4, + 0x836D, 0xDDA6, + 0x836E, 0xDDA7, + 0x836F, 0xD2A9, + 0x8377, 0xBAC9, + 0x8378, 0xDDA9, + 0x837B, 0xDDB6, + 0x837C, 0xDDB1, + 0x837D, 0xDDB4, + 0x8385, 0xDDB0, + 0x8386, 0xC6CE, + 0x8389, 0xC0F2, + 0x838E, 0xC9AF, + 0x8392, 0xDCEC, + 0x8393, 0xDDAE, + 0x8398, 0xDDB7, + 0x839B, 0xDCF0, + 0x839C, 0xDDAF, + 0x839E, 0xDDB8, + 0x83A0, 0xDDAC, + 0x83A8, 0xDDB9, + 0x83A9, 0xDDB3, + 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, + 0x83B0, 0xDDA8, + 0x83B1, 0xC0B3, + 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, + 0x83B4, 0xDDAB, + 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, + 0x83B8, 0xDDB5, + 0x83B9, 0xD3A8, + 0x83BA, 0xDDBA, + 0x83BC, 0xDDBB, + 0x83BD, 0xC3A7, + 0x83C0, 0xDDD2, + 0x83C1, 0xDDBC, + 0x83C5, 0xDDD1, + 0x83C7, 0xB9BD, + 0x83CA, 0xBED5, + 0x83CC, 0xBEFA, + 0x83CF, 0xBACA, + 0x83D4, 0xDDCA, + 0x83D6, 0xDDC5, + 0x83D8, 0xDDBF, + 0x83DC, 0xB2CB, + 0x83DD, 0xDDC3, + 0x83DF, 0xDDCB, + 0x83E0, 0xB2A4, + 0x83E1, 0xDDD5, + 0x83E5, 0xDDBE, + 0x83E9, 0xC6D0, + 0x83EA, 0xDDD0, + 0x83F0, 0xDDD4, + 0x83F1, 0xC1E2, + 0x83F2, 0xB7C6, + 0x83F8, 0xDDCE, + 0x83F9, 0xDDCF, + 0x83FD, 0xDDC4, + 0x8401, 0xDDBD, + 0x8403, 0xDDCD, + 0x8404, 0xCCD1, + 0x8406, 0xDDC9, + 0x840B, 0xDDC2, + 0x840C, 0xC3C8, + 0x840D, 0xC6BC, + 0x840E, 0xCEAE, + 0x840F, 0xDDCC, + 0x8411, 0xDDC8, + 0x8418, 0xDDC1, + 0x841C, 0xDDC6, + 0x841D, 0xC2DC, + 0x8424, 0xD3A9, + 0x8425, 0xD3AA, + 0x8426, 0xDDD3, + 0x8427, 0xCFF4, + 0x8428, 0xC8F8, + 0x8431, 0xDDE6, + 0x8438, 0xDDC7, + 0x843C, 0xDDE0, + 0x843D, 0xC2E4, + 0x8446, 0xDDE1, + 0x8451, 0xDDD7, + 0x8457, 0xD6F8, + 0x8459, 0xDDD9, + 0x845A, 0xDDD8, + 0x845B, 0xB8F0, + 0x845C, 0xDDD6, + 0x8461, 0xC6CF, + 0x8463, 0xB6AD, + 0x8469, 0xDDE2, + 0x846B, 0xBAF9, + 0x846C, 0xD4E1, + 0x846D, 0xDDE7, + 0x8471, 0xB4D0, + 0x8473, 0xDDDA, + 0x8475, 0xBFFB, + 0x8476, 0xDDE3, + 0x8478, 0xDDDF, + 0x847A, 0xDDDD, + 0x8482, 0xB5D9, + 0x8487, 0xDDDB, + 0x8488, 0xDDDC, + 0x8489, 0xDDDE, + 0x848B, 0xBDAF, + 0x848C, 0xDDE4, + 0x848E, 0xDDE5, + 0x8497, 0xDDF5, + 0x8499, 0xC3C9, + 0x849C, 0xCBE2, + 0x84A1, 0xDDF2, + 0x84AF, 0xD8E1, + 0x84B2, 0xC6D1, + 0x84B4, 0xDDF4, + 0x84B8, 0xD5F4, + 0x84B9, 0xDDF3, + 0x84BA, 0xDDF0, + 0x84BD, 0xDDEC, + 0x84BF, 0xDDEF, + 0x84C1, 0xDDE8, + 0x84C4, 0xD0EE, + 0x84C9, 0xC8D8, + 0x84CA, 0xDDEE, + 0x84CD, 0xDDE9, + 0x84D0, 0xDDEA, + 0x84D1, 0xCBF2, + 0x84D3, 0xDDED, + 0x84D6, 0xB1CD, + 0x84DD, 0xC0B6, + 0x84DF, 0xBCBB, + 0x84E0, 0xDDF1, + 0x84E3, 0xDDF7, + 0x84E5, 0xDDF6, + 0x84E6, 0xDDEB, + 0x84EC, 0xC5EE, + 0x84F0, 0xDDFB, + 0x84FC, 0xDEA4, + 0x84FF, 0xDEA3, + 0x850C, 0xDDF8, + 0x8511, 0xC3EF, + 0x8513, 0xC2FB, + 0x8517, 0xD5E1, + 0x851A, 0xCEB5, + 0x851F, 0xDDFD, + 0x8521, 0xB2CC, + 0x852B, 0xC4E8, + 0x852C, 0xCADF, + 0x8537, 0xC7BE, + 0x8538, 0xDDFA, + 0x8539, 0xDDFC, + 0x853A, 0xDDFE, + 0x853B, 0xDEA2, + 0x853C, 0xB0AA, + 0x853D, 0xB1CE, + 0x8543, 0xDEAC, + 0x8548, 0xDEA6, + 0x8549, 0xBDB6, + 0x854A, 0xC8EF, + 0x8556, 0xDEA1, + 0x8559, 0xDEA5, + 0x855E, 0xDEA9, + 0x8564, 0xDEA8, + 0x8568, 0xDEA7, + 0x8572, 0xDEAD, + 0x8574, 0xD4CC, + 0x8579, 0xDEB3, + 0x857A, 0xDEAA, + 0x857B, 0xDEAE, + 0x857E, 0xC0D9, + 0x8584, 0xB1A1, + 0x8585, 0xDEB6, + 0x8587, 0xDEB1, + 0x858F, 0xDEB2, + 0x859B, 0xD1A6, + 0x859C, 0xDEB5, + 0x85A4, 0xDEAF, + 0x85A8, 0xDEB0, + 0x85AA, 0xD0BD, + 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, + 0x85B0, 0xDEB9, + 0x85B7, 0xDEB8, + 0x85B9, 0xDEB7, + 0x85C1, 0xDEBB, + 0x85C9, 0xBDE5, + 0x85CF, 0xB2D8, + 0x85D0, 0xC3EA, + 0x85D3, 0xDEBA, + 0x85D5, 0xC5BA, + 0x85DC, 0xDEBC, + 0x85E4, 0xCCD9, + 0x85E9, 0xB7AA, + 0x85FB, 0xD4E5, + 0x85FF, 0xDEBD, + 0x8605, 0xDEBF, + 0x8611, 0xC4A2, + 0x8616, 0xDEC1, + 0x8627, 0xDEBE, + 0x8629, 0xDEC0, + 0x8638, 0xD5BA, + 0x863C, 0xDEC2, + 0x864D, 0xF2AE, + 0x864E, 0xBBA2, + 0x864F, 0xC2B2, + 0x8650, 0xC5B0, + 0x8651, 0xC2C7, + 0x8654, 0xF2AF, + 0x865A, 0xD0E9, + 0x865E, 0xD3DD, + 0x8662, 0xEBBD, + 0x866B, 0xB3E6, + 0x866C, 0xF2B0, + 0x866E, 0xF2B1, + 0x8671, 0xCAAD, + 0x8679, 0xBAE7, + 0x867A, 0xF2B3, + 0x867B, 0xF2B5, + 0x867C, 0xF2B4, + 0x867D, 0xCBE4, + 0x867E, 0xCFBA, + 0x867F, 0xF2B2, + 0x8680, 0xCAB4, + 0x8681, 0xD2CF, + 0x8682, 0xC2EC, + 0x868A, 0xCEC3, + 0x868B, 0xF2B8, + 0x868C, 0xB0F6, + 0x868D, 0xF2B7, + 0x8693, 0xF2BE, + 0x8695, 0xB2CF, + 0x869C, 0xD1C1, + 0x869D, 0xF2BA, + 0x86A3, 0xF2BC, + 0x86A4, 0xD4E9, + 0x86A7, 0xF2BB, + 0x86A8, 0xF2B6, + 0x86A9, 0xF2BF, + 0x86AA, 0xF2BD, + 0x86AC, 0xF2B9, + 0x86AF, 0xF2C7, + 0x86B0, 0xF2C4, + 0x86B1, 0xF2C6, + 0x86B4, 0xF2CA, + 0x86B5, 0xF2C2, + 0x86B6, 0xF2C0, + 0x86BA, 0xF2C5, + 0x86C0, 0xD6FB, + 0x86C4, 0xF2C1, + 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, + 0x86C9, 0xF2C8, + 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, + 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, + 0x86D0, 0xF2D0, + 0x86D1, 0xF2D6, + 0x86D4, 0xBBD7, + 0x86D8, 0xF2D5, + 0x86D9, 0xCDDC, + 0x86DB, 0xD6EB, + 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, + 0x86E4, 0xB8F2, + 0x86E9, 0xF2CB, + 0x86ED, 0xF2CE, + 0x86EE, 0xC2F9, + 0x86F0, 0xD5DD, + 0x86F1, 0xF2CC, + 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, + 0x86F4, 0xF2D3, + 0x86F8, 0xF2D9, + 0x86F9, 0xD3BC, + 0x86FE, 0xB6EA, + 0x8700, 0xCAF1, + 0x8702, 0xB7E4, + 0x8703, 0xF2D7, + 0x8707, 0xF2D8, + 0x8708, 0xF2DA, + 0x8709, 0xF2DD, + 0x870A, 0xF2DB, + 0x870D, 0xF2DC, + 0x8712, 0xD1D1, + 0x8713, 0xF2D1, + 0x8715, 0xCDC9, + 0x8717, 0xCECF, + 0x8718, 0xD6A9, + 0x871A, 0xF2E3, + 0x871C, 0xC3DB, + 0x871E, 0xF2E0, + 0x8721, 0xC0AF, + 0x8722, 0xF2EC, + 0x8723, 0xF2DE, + 0x8725, 0xF2E1, + 0x8729, 0xF2E8, + 0x872E, 0xF2E2, + 0x8731, 0xF2E7, + 0x8734, 0xF2E6, + 0x8737, 0xF2E9, + 0x873B, 0xF2DF, + 0x873E, 0xF2E4, + 0x873F, 0xF2EA, + 0x8747, 0xD3AC, + 0x8748, 0xF2E5, + 0x8749, 0xB2F5, + 0x874C, 0xF2F2, + 0x874E, 0xD0AB, + 0x8753, 0xF2F5, + 0x8757, 0xBBC8, + 0x8759, 0xF2F9, + 0x8760, 0xF2F0, + 0x8763, 0xF2F6, + 0x8764, 0xF2F8, + 0x8765, 0xF2FA, + 0x876E, 0xF2F3, + 0x8770, 0xF2F1, + 0x8774, 0xBAFB, + 0x8776, 0xB5FB, + 0x877B, 0xF2EF, + 0x877C, 0xF2F7, + 0x877D, 0xF2ED, + 0x877E, 0xF2EE, + 0x8782, 0xF2EB, + 0x8783, 0xF3A6, + 0x8785, 0xF3A3, + 0x8788, 0xF3A2, + 0x878B, 0xF2F4, + 0x878D, 0xC8DA, + 0x8793, 0xF2FB, + 0x8797, 0xF3A5, + 0x879F, 0xC3F8, + 0x87A8, 0xF2FD, + 0x87AB, 0xF3A7, + 0x87AC, 0xF3A9, + 0x87AD, 0xF3A4, + 0x87AF, 0xF2FC, + 0x87B3, 0xF3AB, + 0x87B5, 0xF3AA, + 0x87BA, 0xC2DD, + 0x87BD, 0xF3AE, + 0x87C0, 0xF3B0, + 0x87C6, 0xF3A1, + 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, + 0x87D1, 0xF3AF, + 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, + 0x87DB, 0xF3B2, + 0x87E0, 0xF3B4, + 0x87E5, 0xF3A8, + 0x87EA, 0xF3B3, + 0x87EE, 0xF3B5, + 0x87F9, 0xD0B7, + 0x87FE, 0xF3B8, + 0x8803, 0xD9F9, + 0x880A, 0xF3B9, + 0x8813, 0xF3B7, + 0x8815, 0xC8E4, + 0x8816, 0xF3B6, + 0x881B, 0xF3BA, + 0x8821, 0xF3BB, + 0x8822, 0xB4C0, + 0x8832, 0xEEC3, + 0x8839, 0xF3BC, + 0x883C, 0xF3BD, + 0x8840, 0xD1AA, + 0x8844, 0xF4AC, + 0x8845, 0xD0C6, + 0x884C, 0xD0D0, + 0x884D, 0xD1DC, + 0x8854, 0xCFCE, + 0x8857, 0xBDD6, + 0x8859, 0xD1C3, + 0x8861, 0xBAE2, + 0x8862, 0xE1E9, + 0x8863, 0xD2C2, + 0x8864, 0xF1C2, + 0x8865, 0xB2B9, + 0x8868, 0xB1ED, + 0x8869, 0xF1C3, + 0x886B, 0xC9C0, + 0x886C, 0xB3C4, + 0x886E, 0xD9F2, + 0x8870, 0xCBA5, + 0x8872, 0xF1C4, + 0x8877, 0xD6D4, + 0x887D, 0xF1C5, + 0x887E, 0xF4C0, + 0x887F, 0xF1C6, + 0x8881, 0xD4AC, + 0x8882, 0xF1C7, + 0x8884, 0xB0C0, + 0x8885, 0xF4C1, + 0x8888, 0xF4C2, + 0x888B, 0xB4FC, + 0x888D, 0xC5DB, + 0x8892, 0xCCBB, + 0x8896, 0xD0E4, + 0x889C, 0xCDE0, + 0x88A2, 0xF1C8, + 0x88A4, 0xD9F3, + 0x88AB, 0xB1BB, + 0x88AD, 0xCFAE, + 0x88B1, 0xB8A4, + 0x88B7, 0xF1CA, + 0x88BC, 0xF1CB, + 0x88C1, 0xB2C3, + 0x88C2, 0xC1D1, + 0x88C5, 0xD7B0, + 0x88C6, 0xF1C9, + 0x88C9, 0xF1CC, + 0x88CE, 0xF1CE, + 0x88D2, 0xD9F6, + 0x88D4, 0xD2E1, + 0x88D5, 0xD4A3, + 0x88D8, 0xF4C3, + 0x88D9, 0xC8B9, + 0x88DF, 0xF4C4, + 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, + 0x88E4, 0xBFE3, + 0x88E5, 0xF1D0, + 0x88E8, 0xF1D4, + 0x88F0, 0xF1D6, + 0x88F1, 0xF1D1, + 0x88F3, 0xC9D1, + 0x88F4, 0xC5E1, + 0x88F8, 0xC2E3, + 0x88F9, 0xB9FC, + 0x88FC, 0xF1D3, + 0x88FE, 0xF1D5, + 0x8902, 0xB9D3, + 0x890A, 0xF1DB, + 0x8910, 0xBAD6, + 0x8912, 0xB0FD, + 0x8913, 0xF1D9, + 0x8919, 0xF1D8, + 0x891A, 0xF1D2, + 0x891B, 0xF1DA, + 0x8921, 0xF1D7, + 0x8925, 0xC8EC, + 0x892A, 0xCDCA, + 0x892B, 0xF1DD, + 0x8930, 0xE5BD, + 0x8934, 0xF1DC, + 0x8936, 0xF1DE, + 0x8941, 0xF1DF, + 0x8944, 0xCFE5, + 0x895E, 0xF4C5, + 0x895F, 0xBDF3, + 0x8966, 0xF1E0, + 0x897B, 0xF1E1, + 0x897F, 0xCEF7, + 0x8981, 0xD2AA, + 0x8983, 0xF1FB, + 0x8986, 0xB8B2, + 0x89C1, 0xBCFB, + 0x89C2, 0xB9DB, + 0x89C4, 0xB9E6, + 0x89C5, 0xC3D9, + 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, + 0x89C8, 0xC0C0, + 0x89C9, 0xBEF5, + 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, + 0x89CC, 0xEAEB, + 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, + 0x89D0, 0xEAEE, + 0x89D1, 0xEAEF, + 0x89D2, 0xBDC7, + 0x89D6, 0xF5FB, + 0x89DA, 0xF5FD, + 0x89DC, 0xF5FE, + 0x89DE, 0xF5FC, + 0x89E3, 0xBDE2, + 0x89E5, 0xF6A1, + 0x89E6, 0xB4A5, + 0x89EB, 0xF6A2, + 0x89EF, 0xF6A3, + 0x89F3, 0xECB2, + 0x8A00, 0xD1D4, + 0x8A07, 0xD9EA, + 0x8A3E, 0xF6A4, + 0x8A48, 0xEEBA, + 0x8A79, 0xD5B2, + 0x8A89, 0xD3FE, + 0x8A8A, 0xCCDC, + 0x8A93, 0xCAC4, + 0x8B07, 0xE5C0, + 0x8B26, 0xF6A5, + 0x8B66, 0xBEAF, + 0x8B6C, 0xC6A9, + 0x8BA0, 0xDAA5, + 0x8BA1, 0xBCC6, + 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, + 0x8BA4, 0xC8CF, + 0x8BA5, 0xBCA5, + 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, + 0x8BA8, 0xCCD6, + 0x8BA9, 0xC8C3, + 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, + 0x8BAD, 0xD1B5, + 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, + 0x8BB0, 0xBCC7, + 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, + 0x8BB4, 0xDAA9, + 0x8BB5, 0xDAAA, + 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, + 0x8BB8, 0xD0ED, + 0x8BB9, 0xB6EF, + 0x8BBA, 0xC2DB, + 0x8BBC, 0xCBCF, + 0x8BBD, 0xB7ED, + 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, + 0x8BC0, 0xBEF7, + 0x8BC1, 0xD6A4, + 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, + 0x8BC4, 0xC6C0, + 0x8BC5, 0xD7E7, + 0x8BC6, 0xCAB6, + 0x8BC8, 0xD5A9, + 0x8BC9, 0xCBDF, + 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, + 0x8BCC, 0xD6DF, + 0x8BCD, 0xB4CA, + 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, + 0x8BD1, 0xD2EB, + 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, + 0x8BD4, 0xDAB3, + 0x8BD5, 0xCAD4, + 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, + 0x8BD8, 0xDAB5, + 0x8BD9, 0xDAB6, + 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, + 0x8BDC, 0xDAB7, + 0x8BDD, 0xBBB0, + 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, + 0x8BE0, 0xDAB9, + 0x8BE1, 0xB9EE, + 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, + 0x8BE4, 0xDABA, + 0x8BE5, 0xB8C3, + 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, + 0x8BE8, 0xDABB, + 0x8BE9, 0xDABC, + 0x8BEB, 0xBDEB, + 0x8BEC, 0xCEDC, + 0x8BED, 0xD3EF, + 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, + 0x8BF0, 0xDABE, + 0x8BF1, 0xD3D5, + 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, + 0x8BF4, 0xCBB5, + 0x8BF5, 0xCBD0, + 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, + 0x8BF8, 0xD6EE, + 0x8BF9, 0xDAC1, + 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, + 0x8BFC, 0xDAC2, + 0x8BFD, 0xB7CC, + 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, + 0x8C00, 0xDAC4, + 0x8C01, 0xCBAD, + 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, + 0x8C04, 0xDAC6, + 0x8C05, 0xC1C2, + 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, + 0x8C08, 0xCCB8, + 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, + 0x8C0C, 0xDAC8, + 0x8C0D, 0xB5FD, + 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, + 0x8C10, 0xD0B3, + 0x8C11, 0xDACA, + 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, + 0x8C14, 0xDACC, + 0x8C15, 0xDACD, + 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, + 0x8C18, 0xDAD1, + 0x8C19, 0xDACF, + 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, + 0x8C1C, 0xC3D5, + 0x8C1D, 0xDAD2, + 0x8C1F, 0xDAD3, + 0x8C20, 0xDAD4, + 0x8C21, 0xDAD5, + 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, + 0x8C24, 0xB0F9, + 0x8C25, 0xDAD6, + 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, + 0x8C28, 0xBDF7, + 0x8C29, 0xC3A1, + 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, + 0x8C2C, 0xC3FD, + 0x8C2D, 0xCCB7, + 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, + 0x8C30, 0xC0BE, + 0x8C31, 0xC6D7, + 0x8C32, 0xDADC, + 0x8C33, 0xDADD, + 0x8C34, 0xC7B4, + 0x8C35, 0xDADE, + 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, + 0x8C41, 0xBBED, + 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, + 0x8C49, 0xF4F9, + 0x8C4C, 0xCDE3, + 0x8C55, 0xF5B9, + 0x8C5A, 0xEBE0, + 0x8C61, 0xCFF3, + 0x8C62, 0xBBBF, + 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, + 0x8C73, 0xE1D9, + 0x8C78, 0xF5F4, + 0x8C79, 0xB1AA, + 0x8C7A, 0xB2F2, + 0x8C82, 0xF5F5, + 0x8C85, 0xF5F7, + 0x8C89, 0xBAD1, + 0x8C8A, 0xF5F6, + 0x8C8C, 0xC3B2, + 0x8C94, 0xF5F9, + 0x8C98, 0xF5F8, + 0x8D1D, 0xB1B4, + 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, + 0x8D21, 0xB9B1, + 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, + 0x8D24, 0xCFCD, + 0x8D25, 0xB0DC, + 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, + 0x8D28, 0xD6CA, + 0x8D29, 0xB7B7, + 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, + 0x8D2C, 0xB1E1, + 0x8D2D, 0xB9BA, + 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, + 0x8D30, 0xB7A1, + 0x8D31, 0xBCFA, + 0x8D32, 0xEADA, + 0x8D33, 0xEADB, + 0x8D34, 0xCCF9, + 0x8D35, 0xB9F3, + 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, + 0x8D38, 0xC3B3, + 0x8D39, 0xB7D1, + 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, + 0x8D3C, 0xD4F4, + 0x8D3D, 0xEADE, + 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, + 0x8D40, 0xEADF, + 0x8D41, 0xC1DE, + 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, + 0x8D44, 0xD7CA, + 0x8D45, 0xEAE0, + 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, + 0x8D48, 0xEAE2, + 0x8D49, 0xEAE3, + 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, + 0x8D4C, 0xB6C4, + 0x8D4D, 0xEAE5, + 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, + 0x8D50, 0xB4CD, + 0x8D53, 0xE2D9, + 0x8D54, 0xC5E2, + 0x8D55, 0xEAE6, + 0x8D56, 0xC0B5, + 0x8D58, 0xD7B8, + 0x8D59, 0xEAE7, + 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, + 0x8D5C, 0xD8D3, + 0x8D5D, 0xD8CD, + 0x8D5E, 0xD4DE, + 0x8D60, 0xD4F9, + 0x8D61, 0xC9C4, + 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, + 0x8D64, 0xB3E0, + 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, + 0x8D6B, 0xBAD5, + 0x8D6D, 0xF4F7, + 0x8D70, 0xD7DF, + 0x8D73, 0xF4F1, + 0x8D74, 0xB8B0, + 0x8D75, 0xD5D4, + 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, + 0x8D81, 0xB3C3, + 0x8D84, 0xF4F2, + 0x8D85, 0xB3AC, + 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, + 0x8D91, 0xF4F4, + 0x8D94, 0xF4F3, + 0x8D9F, 0xCCCB, + 0x8DA3, 0xC8A4, + 0x8DB1, 0xF4F5, + 0x8DB3, 0xD7E3, + 0x8DB4, 0xC5BF, + 0x8DB5, 0xF5C0, + 0x8DB8, 0xF5BB, + 0x8DBA, 0xF5C3, + 0x8DBC, 0xF5C2, + 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, + 0x8DC3, 0xD4BE, + 0x8DC4, 0xF5C4, + 0x8DC6, 0xF5CC, + 0x8DCB, 0xB0CF, + 0x8DCC, 0xB5F8, + 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, + 0x8DD1, 0xC5DC, + 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, + 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, + 0x8DDD, 0xBEE0, + 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, + 0x8DE3, 0xF5D0, + 0x8DE4, 0xF5D3, + 0x8DE8, 0xBFE7, + 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, + 0x8DEC, 0xF5CD, + 0x8DEF, 0xC2B7, + 0x8DF3, 0xCCF8, + 0x8DF5, 0xBCF9, + 0x8DF7, 0xF5CE, + 0x8DF8, 0xF5CF, + 0x8DF9, 0xF5D1, + 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, + 0x8DFD, 0xF5D5, + 0x8E05, 0xF5BD, + 0x8E09, 0xF5D4, + 0x8E0A, 0xD3BB, + 0x8E0C, 0xB3EC, + 0x8E0F, 0xCCA4, + 0x8E14, 0xF5D6, + 0x8E1D, 0xF5D7, + 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, + 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, + 0x8E29, 0xB2C8, + 0x8E2A, 0xD7D9, + 0x8E2C, 0xF5D9, + 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, + 0x8E31, 0xF5E2, + 0x8E35, 0xF5E0, + 0x8E39, 0xF5DF, + 0x8E3A, 0xF5DD, + 0x8E3D, 0xF5E1, + 0x8E40, 0xF5DE, + 0x8E41, 0xF5E4, + 0x8E42, 0xF5E5, + 0x8E44, 0xCCE3, + 0x8E47, 0xE5BF, + 0x8E48, 0xB5B8, + 0x8E49, 0xF5E3, + 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, + 0x8E51, 0xF5E6, + 0x8E52, 0xF5E7, + 0x8E59, 0xF5BE, + 0x8E66, 0xB1C4, + 0x8E69, 0xF5BF, + 0x8E6C, 0xB5C5, + 0x8E6D, 0xB2E4, + 0x8E6F, 0xF5EC, + 0x8E70, 0xF5E9, + 0x8E72, 0xB6D7, + 0x8E74, 0xF5ED, + 0x8E76, 0xF5EA, + 0x8E7C, 0xF5EB, + 0x8E7F, 0xB4DA, + 0x8E81, 0xD4EA, + 0x8E85, 0xF5EE, + 0x8E87, 0xB3F9, + 0x8E8F, 0xF5EF, + 0x8E90, 0xF5F1, + 0x8E94, 0xF5F0, + 0x8E9C, 0xF5F2, + 0x8E9E, 0xF5F3, + 0x8EAB, 0xC9ED, + 0x8EAC, 0xB9AA, + 0x8EAF, 0xC7FB, + 0x8EB2, 0xB6E3, + 0x8EBA, 0xCCC9, + 0x8ECE, 0xEAA6, + 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, + 0x8F68, 0xB9EC, + 0x8F69, 0xD0F9, + 0x8F6B, 0xE9ED, + 0x8F6C, 0xD7AA, + 0x8F6D, 0xE9EE, + 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, + 0x8F70, 0xBAE4, + 0x8F71, 0xE9EF, + 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, + 0x8F74, 0xD6E1, + 0x8F75, 0xE9F2, + 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, + 0x8F78, 0xE9F4, + 0x8F79, 0xE9F6, + 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, + 0x8F7C, 0xE9F8, + 0x8F7D, 0xD4D8, + 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, + 0x8F81, 0xE9FA, + 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, + 0x8F84, 0xE9FC, + 0x8F85, 0xB8A8, + 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, + 0x8F88, 0xB1B2, + 0x8F89, 0xBBD4, + 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, + 0x8F8D, 0xEAA1, + 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, + 0x8F90, 0xB7F8, + 0x8F91, 0xBCAD, + 0x8F93, 0xCAE4, + 0x8F94, 0xE0CE, + 0x8F95, 0xD4AF, + 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, + 0x8F98, 0xEAA4, + 0x8F99, 0xD5DE, + 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, + 0x8F9C, 0xB9BC, + 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, + 0x8FA3, 0xC0B1, + 0x8FA8, 0xB1E6, + 0x8FA9, 0xB1E7, + 0x8FAB, 0xB1E8, + 0x8FB0, 0xB3BD, + 0x8FB1, 0xC8E8, + 0x8FB6, 0xE5C1, + 0x8FB9, 0xB1DF, + 0x8FBD, 0xC1C9, + 0x8FBE, 0xB4EF, + 0x8FC1, 0xC7A8, + 0x8FC2, 0xD3D8, + 0x8FC4, 0xC6F9, + 0x8FC5, 0xD1B8, + 0x8FC7, 0xB9FD, + 0x8FC8, 0xC2F5, + 0x8FCE, 0xD3AD, + 0x8FD0, 0xD4CB, + 0x8FD1, 0xBDFC, + 0x8FD3, 0xE5C2, + 0x8FD4, 0xB7B5, + 0x8FD5, 0xE5C3, + 0x8FD8, 0xBBB9, + 0x8FD9, 0xD5E2, + 0x8FDB, 0xBDF8, + 0x8FDC, 0xD4B6, + 0x8FDD, 0xCEA5, + 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, + 0x8FE2, 0xCCF6, + 0x8FE4, 0xE5C6, + 0x8FE5, 0xE5C4, + 0x8FE6, 0xE5C8, + 0x8FE8, 0xE5CA, + 0x8FE9, 0xE5C7, + 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, + 0x8FED, 0xB5FC, + 0x8FEE, 0xE5C5, + 0x8FF0, 0xCAF6, + 0x8FF3, 0xE5C9, + 0x8FF7, 0xC3D4, + 0x8FF8, 0xB1C5, + 0x8FF9, 0xBCA3, + 0x8FFD, 0xD7B7, + 0x9000, 0xCDCB, + 0x9001, 0xCBCD, + 0x9002, 0xCACA, + 0x9003, 0xCCD3, + 0x9004, 0xE5CC, + 0x9005, 0xE5CB, + 0x9006, 0xC4E6, + 0x9009, 0xD1A1, + 0x900A, 0xD1B7, + 0x900B, 0xE5CD, + 0x900D, 0xE5D0, + 0x900F, 0xCDB8, + 0x9010, 0xD6F0, + 0x9011, 0xE5CF, + 0x9012, 0xB5DD, + 0x9014, 0xCDBE, + 0x9016, 0xE5D1, + 0x9017, 0xB6BA, + 0x901A, 0xCDA8, + 0x901B, 0xB9E4, + 0x901D, 0xCAC5, + 0x901E, 0xB3D1, + 0x901F, 0xCBD9, + 0x9020, 0xD4EC, + 0x9021, 0xE5D2, + 0x9022, 0xB7EA, + 0x9026, 0xE5CE, + 0x902D, 0xE5D5, + 0x902E, 0xB4FE, + 0x902F, 0xE5D6, + 0x9035, 0xE5D3, + 0x9036, 0xE5D4, + 0x9038, 0xD2DD, + 0x903B, 0xC2DF, + 0x903C, 0xB1C6, + 0x903E, 0xD3E2, + 0x9041, 0xB6DD, + 0x9042, 0xCBEC, + 0x9044, 0xE5D7, + 0x9047, 0xD3F6, + 0x904D, 0xB1E9, + 0x904F, 0xB6F4, + 0x9050, 0xE5DA, + 0x9051, 0xE5D8, + 0x9052, 0xE5D9, + 0x9053, 0xB5C0, + 0x9057, 0xD2C5, + 0x9058, 0xE5DC, + 0x905B, 0xE5DE, + 0x9062, 0xE5DD, + 0x9063, 0xC7B2, + 0x9065, 0xD2A3, + 0x9068, 0xE5DB, + 0x906D, 0xD4E2, + 0x906E, 0xD5DA, + 0x9074, 0xE5E0, + 0x9075, 0xD7F1, + 0x907D, 0xE5E1, + 0x907F, 0xB1DC, + 0x9080, 0xD1FB, + 0x9082, 0xE5E2, + 0x9083, 0xE5E4, + 0x9088, 0xE5E3, + 0x908B, 0xE5E5, + 0x9091, 0xD2D8, + 0x9093, 0xB5CB, + 0x9095, 0xE7DF, + 0x9097, 0xDAF5, + 0x9099, 0xDAF8, + 0x909B, 0xDAF6, + 0x909D, 0xDAF7, + 0x90A1, 0xDAFA, + 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, + 0x90A6, 0xB0EE, + 0x90AA, 0xD0B0, + 0x90AC, 0xDAF9, + 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, + 0x90B0, 0xDBA2, + 0x90B1, 0xC7F1, + 0x90B3, 0xDAFC, + 0x90B4, 0xDAFB, + 0x90B5, 0xC9DB, + 0x90B6, 0xDAFD, + 0x90B8, 0xDBA1, + 0x90B9, 0xD7DE, + 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, + 0x90BE, 0xDBA5, + 0x90C1, 0xD3F4, + 0x90C4, 0xDBA7, + 0x90C5, 0xDBA4, + 0x90C7, 0xDBA8, + 0x90CA, 0xBDBC, + 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, + 0x90D0, 0xDBA6, + 0x90D1, 0xD6A3, + 0x90D3, 0xDBA9, + 0x90D7, 0xDBAD, + 0x90DB, 0xDBAE, + 0x90DC, 0xDBAC, + 0x90DD, 0xBAC2, + 0x90E1, 0xBFA4, + 0x90E2, 0xDBAB, + 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, + 0x90E8, 0xB2BF, + 0x90EB, 0xDBAF, + 0x90ED, 0xB9F9, + 0x90EF, 0xDBB0, + 0x90F4, 0xB3BB, + 0x90F8, 0xB5A6, + 0x90FD, 0xB6BC, + 0x90FE, 0xDBB1, + 0x9102, 0xB6F5, + 0x9104, 0xDBB2, + 0x9119, 0xB1C9, + 0x911E, 0xDBB4, + 0x9122, 0xDBB3, + 0x9123, 0xDBB5, + 0x912F, 0xDBB7, + 0x9131, 0xDBB6, + 0x9139, 0xDBB8, + 0x9143, 0xDBB9, + 0x9146, 0xDBBA, + 0x9149, 0xD3CF, + 0x914A, 0xF4FA, + 0x914B, 0xC7F5, + 0x914C, 0xD7C3, + 0x914D, 0xC5E4, + 0x914E, 0xF4FC, + 0x914F, 0xF4FD, + 0x9150, 0xF4FB, + 0x9152, 0xBEC6, + 0x9157, 0xD0EF, + 0x915A, 0xB7D3, + 0x915D, 0xD4CD, + 0x915E, 0xCCAA, + 0x9161, 0xF5A2, + 0x9162, 0xF5A1, + 0x9163, 0xBAA8, + 0x9164, 0xF4FE, + 0x9165, 0xCBD6, + 0x9169, 0xF5A4, + 0x916A, 0xC0D2, + 0x916C, 0xB3EA, + 0x916E, 0xCDAA, + 0x916F, 0xF5A5, + 0x9170, 0xF5A3, + 0x9171, 0xBDB4, + 0x9172, 0xF5A8, + 0x9174, 0xF5A9, + 0x9175, 0xBDCD, + 0x9176, 0xC3B8, + 0x9177, 0xBFE1, + 0x9178, 0xCBE1, + 0x9179, 0xF5AA, + 0x917D, 0xF5A6, + 0x917E, 0xF5A7, + 0x917F, 0xC4F0, + 0x9185, 0xF5AC, + 0x9187, 0xB4BC, + 0x9189, 0xD7ED, + 0x918B, 0xB4D7, + 0x918C, 0xF5AB, + 0x918D, 0xF5AE, + 0x9190, 0xF5AD, + 0x9191, 0xF5AF, + 0x9192, 0xD0D1, + 0x919A, 0xC3D1, + 0x919B, 0xC8A9, + 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, + 0x91AA, 0xF5B2, + 0x91AD, 0xF5B3, + 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, + 0x91B4, 0xF5B7, + 0x91B5, 0xF5B6, + 0x91BA, 0xF5B8, + 0x91C7, 0xB2C9, + 0x91C9, 0xD3D4, + 0x91CA, 0xCACD, + 0x91CC, 0xC0EF, + 0x91CD, 0xD6D8, + 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, + 0x91D1, 0xBDF0, + 0x91DC, 0xB8AA, + 0x9274, 0xBCF8, + 0x928E, 0xF6C6, + 0x92AE, 0xF6C7, + 0x92C8, 0xF6C8, + 0x933E, 0xF6C9, + 0x936A, 0xF6CA, + 0x938F, 0xF6CC, + 0x93CA, 0xF6CB, + 0x93D6, 0xF7E9, + 0x943E, 0xF6CD, + 0x946B, 0xF6CE, + 0x9485, 0xEEC4, + 0x9486, 0xEEC5, + 0x9487, 0xEEC6, + 0x9488, 0xD5EB, + 0x9489, 0xB6A4, + 0x948A, 0xEEC8, + 0x948B, 0xEEC7, + 0x948C, 0xEEC9, + 0x948D, 0xEECA, + 0x948E, 0xC7A5, + 0x948F, 0xEECB, + 0x9490, 0xEECC, + 0x9492, 0xB7B0, + 0x9493, 0xB5F6, + 0x9494, 0xEECD, + 0x9495, 0xEECF, + 0x9497, 0xEECE, + 0x9499, 0xB8C6, + 0x949A, 0xEED0, + 0x949B, 0xEED1, + 0x949C, 0xEED2, + 0x949D, 0xB6DB, + 0x949E, 0xB3AE, + 0x949F, 0xD6D3, + 0x94A0, 0xC4C6, + 0x94A1, 0xB1B5, + 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, + 0x94A4, 0xEED4, + 0x94A5, 0xD4BF, + 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, + 0x94A8, 0xCED9, + 0x94A9, 0xB9B3, + 0x94AA, 0xEED6, + 0x94AB, 0xEED5, + 0x94AC, 0xEED8, + 0x94AD, 0xEED7, + 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, + 0x94B0, 0xEEDA, + 0x94B1, 0xC7AE, + 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, + 0x94B4, 0xEEDC, + 0x94B5, 0xB2A7, + 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, + 0x94B8, 0xEEDF, + 0x94B9, 0xEEE0, + 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, + 0x94BC, 0xEEE2, + 0x94BD, 0xEEE3, + 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, + 0x94C0, 0xD3CB, + 0x94C1, 0xCCFA, + 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, + 0x94C4, 0xEEE5, + 0x94C5, 0xC7A6, + 0x94C6, 0xC3AD, + 0x94C8, 0xEEE6, + 0x94C9, 0xEEE7, + 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, + 0x94CC, 0xEEEA, + 0x94CD, 0xEEEB, + 0x94CE, 0xEEEC, + 0x94D0, 0xEEED, + 0x94D1, 0xEEEE, + 0x94D2, 0xEEEF, + 0x94D5, 0xEEF0, + 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, + 0x94D8, 0xEEF4, + 0x94D9, 0xEEF3, + 0x94DB, 0xEEF5, + 0x94DC, 0xCDAD, + 0x94DD, 0xC2C1, + 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, + 0x94E0, 0xEEF8, + 0x94E1, 0xD5A1, + 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, + 0x94E4, 0xEEFA, + 0x94E5, 0xEEFB, + 0x94E7, 0xEEFC, + 0x94E8, 0xEEFD, + 0x94E9, 0xEFA1, + 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, + 0x94EC, 0xB8F5, + 0x94ED, 0xC3FA, + 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, + 0x94F0, 0xBDC2, + 0x94F1, 0xD2BF, + 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, + 0x94F4, 0xEFA6, + 0x94F5, 0xEFA7, + 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, + 0x94F8, 0xD6FD, + 0x94F9, 0xEFA9, + 0x94FA, 0xC6CC, + 0x94FC, 0xEFAA, + 0x94FD, 0xEFAB, + 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, + 0x9500, 0xCFFA, + 0x9501, 0xCBF8, + 0x9502, 0xEFAE, + 0x9503, 0xEFAD, + 0x9504, 0xB3FA, + 0x9505, 0xB9F8, + 0x9506, 0xEFAF, + 0x9507, 0xEFB0, + 0x9508, 0xD0E2, + 0x9509, 0xEFB1, + 0x950A, 0xEFB2, + 0x950B, 0xB7E6, + 0x950C, 0xD0BF, + 0x950D, 0xEFB3, + 0x950E, 0xEFB4, + 0x950F, 0xEFB5, + 0x9510, 0xC8F1, + 0x9511, 0xCCE0, + 0x9512, 0xEFB6, + 0x9513, 0xEFB7, + 0x9514, 0xEFB8, + 0x9515, 0xEFB9, + 0x9516, 0xEFBA, + 0x9517, 0xD5E0, + 0x9518, 0xEFBB, + 0x9519, 0xB4ED, + 0x951A, 0xC3AA, + 0x951B, 0xEFBC, + 0x951D, 0xEFBD, + 0x951E, 0xEFBE, + 0x951F, 0xEFBF, + 0x9521, 0xCEFD, + 0x9522, 0xEFC0, + 0x9523, 0xC2E0, + 0x9524, 0xB4B8, + 0x9525, 0xD7B6, + 0x9526, 0xBDF5, + 0x9528, 0xCFC7, + 0x9529, 0xEFC3, + 0x952A, 0xEFC1, + 0x952B, 0xEFC2, + 0x952C, 0xEFC4, + 0x952D, 0xB6A7, + 0x952E, 0xBCFC, + 0x952F, 0xBEE2, + 0x9530, 0xC3CC, + 0x9531, 0xEFC5, + 0x9532, 0xEFC6, + 0x9534, 0xEFC7, + 0x9535, 0xEFCF, + 0x9536, 0xEFC8, + 0x9537, 0xEFC9, + 0x9538, 0xEFCA, + 0x9539, 0xC7C2, + 0x953A, 0xEFF1, + 0x953B, 0xB6CD, + 0x953C, 0xEFCB, + 0x953E, 0xEFCC, + 0x953F, 0xEFCD, + 0x9540, 0xB6C6, + 0x9541, 0xC3BE, + 0x9542, 0xEFCE, + 0x9544, 0xEFD0, + 0x9545, 0xEFD1, + 0x9546, 0xEFD2, + 0x9547, 0xD5F2, + 0x9549, 0xEFD3, + 0x954A, 0xC4F7, + 0x954C, 0xEFD4, + 0x954D, 0xC4F8, + 0x954E, 0xEFD5, + 0x954F, 0xEFD6, + 0x9550, 0xB8E4, + 0x9551, 0xB0F7, + 0x9552, 0xEFD7, + 0x9553, 0xEFD8, + 0x9554, 0xEFD9, + 0x9556, 0xEFDA, + 0x9557, 0xEFDB, + 0x9558, 0xEFDC, + 0x9559, 0xEFDD, + 0x955B, 0xEFDE, + 0x955C, 0xBEB5, + 0x955D, 0xEFE1, + 0x955E, 0xEFDF, + 0x955F, 0xEFE0, + 0x9561, 0xEFE2, + 0x9562, 0xEFE3, + 0x9563, 0xC1CD, + 0x9564, 0xEFE4, + 0x9565, 0xEFE5, + 0x9566, 0xEFE6, + 0x9567, 0xEFE7, + 0x9568, 0xEFE8, + 0x9569, 0xEFE9, + 0x956A, 0xEFEA, + 0x956B, 0xEFEB, + 0x956C, 0xEFEC, + 0x956D, 0xC0D8, + 0x956F, 0xEFED, + 0x9570, 0xC1AD, + 0x9571, 0xEFEE, + 0x9572, 0xEFEF, + 0x9573, 0xEFF0, + 0x9576, 0xCFE2, + 0x957F, 0xB3A4, + 0x95E8, 0xC3C5, + 0x95E9, 0xE3C5, + 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, + 0x95ED, 0xB1D5, + 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, + 0x95F0, 0xC8F2, + 0x95F1, 0xE3C7, + 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, + 0x95F4, 0xBCE4, + 0x95F5, 0xE3C9, + 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, + 0x95F8, 0xD5A2, + 0x95F9, 0xC4D6, + 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, + 0x95FC, 0xE3CB, + 0x95FD, 0xC3F6, + 0x95FE, 0xE3CC, + 0x9600, 0xB7A7, + 0x9601, 0xB8F3, + 0x9602, 0xBAD2, + 0x9603, 0xE3CD, + 0x9604, 0xE3CE, + 0x9605, 0xD4C4, + 0x9606, 0xE3CF, + 0x9608, 0xE3D0, + 0x9609, 0xD1CB, + 0x960A, 0xE3D1, + 0x960B, 0xE3D2, + 0x960C, 0xE3D3, + 0x960D, 0xE3D4, + 0x960E, 0xD1D6, + 0x960F, 0xE3D5, + 0x9610, 0xB2FB, + 0x9611, 0xC0BB, + 0x9612, 0xE3D6, + 0x9614, 0xC0AB, + 0x9615, 0xE3D7, + 0x9616, 0xE3D8, + 0x9617, 0xE3D9, + 0x9619, 0xE3DA, + 0x961A, 0xE3DB, + 0x961C, 0xB8B7, + 0x961D, 0xDAE2, + 0x961F, 0xB6D3, + 0x9621, 0xDAE4, + 0x9622, 0xDAE3, + 0x962A, 0xDAE6, + 0x962E, 0xC8EE, + 0x9631, 0xDAE5, + 0x9632, 0xB7C0, + 0x9633, 0xD1F4, + 0x9634, 0xD2F5, + 0x9635, 0xD5F3, + 0x9636, 0xBDD7, + 0x963B, 0xD7E8, + 0x963C, 0xDAE8, + 0x963D, 0xDAE7, + 0x963F, 0xB0A2, + 0x9640, 0xCDD3, + 0x9642, 0xDAE9, + 0x9644, 0xB8BD, + 0x9645, 0xBCCA, + 0x9646, 0xC2BD, + 0x9647, 0xC2A4, + 0x9648, 0xB3C2, + 0x9649, 0xDAEA, + 0x964B, 0xC2AA, + 0x964C, 0xC4B0, + 0x964D, 0xBDB5, + 0x9650, 0xCFDE, + 0x9654, 0xDAEB, + 0x9655, 0xC9C2, + 0x965B, 0xB1DD, + 0x965F, 0xDAEC, + 0x9661, 0xB6B8, + 0x9662, 0xD4BA, + 0x9664, 0xB3FD, + 0x9667, 0xDAED, + 0x9668, 0xD4C9, + 0x9669, 0xCFD5, + 0x966A, 0xC5E3, + 0x966C, 0xDAEE, + 0x9672, 0xDAEF, + 0x9674, 0xDAF0, + 0x9675, 0xC1EA, + 0x9676, 0xCCD5, + 0x9677, 0xCFDD, + 0x9685, 0xD3E7, + 0x9686, 0xC2A1, + 0x9688, 0xDAF1, + 0x968B, 0xCBE5, + 0x968D, 0xDAF2, + 0x968F, 0xCBE6, + 0x9690, 0xD2FE, + 0x9694, 0xB8F4, + 0x9697, 0xDAF3, + 0x9698, 0xB0AF, + 0x9699, 0xCFB6, + 0x969C, 0xD5CF, + 0x96A7, 0xCBED, + 0x96B0, 0xDAF4, + 0x96B3, 0xE3C4, + 0x96B6, 0xC1A5, + 0x96B9, 0xF6BF, + 0x96BC, 0xF6C0, + 0x96BD, 0xF6C1, + 0x96BE, 0xC4D1, + 0x96C0, 0xC8B8, + 0x96C1, 0xD1E3, + 0x96C4, 0xD0DB, + 0x96C5, 0xD1C5, + 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, + 0x96C9, 0xEFF4, + 0x96CC, 0xB4C6, + 0x96CD, 0xD3BA, + 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, + 0x96D2, 0xF6C3, + 0x96D5, 0xB5F1, + 0x96E0, 0xF6C5, + 0x96E8, 0xD3EA, + 0x96E9, 0xF6A7, + 0x96EA, 0xD1A9, + 0x96EF, 0xF6A9, + 0x96F3, 0xF6A8, + 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, + 0x96F9, 0xB1A2, + 0x96FE, 0xCEED, + 0x9700, 0xD0E8, + 0x9701, 0xF6AB, + 0x9704, 0xCFF6, + 0x9706, 0xF6AA, + 0x9707, 0xD5F0, + 0x9708, 0xF6AC, + 0x9709, 0xC3B9, + 0x970D, 0xBBF4, + 0x970E, 0xF6AE, + 0x970F, 0xF6AD, + 0x9713, 0xC4DE, + 0x9716, 0xC1D8, + 0x971C, 0xCBAA, + 0x971E, 0xCFBC, + 0x972A, 0xF6AF, + 0x972D, 0xF6B0, + 0x9730, 0xF6B1, + 0x9732, 0xC2B6, + 0x9738, 0xB0D4, + 0x9739, 0xC5F9, + 0x973E, 0xF6B2, + 0x9752, 0xC7E0, + 0x9753, 0xF6A6, + 0x9756, 0xBEB8, + 0x9759, 0xBEB2, + 0x975B, 0xB5E5, + 0x975E, 0xB7C7, + 0x9760, 0xBFBF, + 0x9761, 0xC3D2, + 0x9762, 0xC3E6, + 0x9765, 0xD8CC, + 0x9769, 0xB8EF, + 0x9773, 0xBDF9, + 0x9774, 0xD1A5, + 0x9776, 0xB0D0, + 0x977C, 0xF7B0, + 0x9785, 0xF7B1, + 0x978B, 0xD0AC, + 0x978D, 0xB0B0, + 0x9791, 0xF7B2, + 0x9792, 0xF7B3, + 0x9794, 0xF7B4, + 0x9798, 0xC7CA, + 0x97A0, 0xBECF, + 0x97A3, 0xF7B7, + 0x97AB, 0xF7B6, + 0x97AD, 0xB1DE, + 0x97AF, 0xF7B5, + 0x97B2, 0xF7B8, + 0x97B4, 0xF7B9, + 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, + 0x97E9, 0xBAAB, + 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, + 0x97EC, 0xE8BA, + 0x97ED, 0xBEC2, + 0x97F3, 0xD2F4, + 0x97F5, 0xD4CF, + 0x97F6, 0xC9D8, + 0x9875, 0xD2B3, + 0x9876, 0xB6A5, + 0x9877, 0xC7EA, + 0x9878, 0xF1FC, + 0x9879, 0xCFEE, + 0x987A, 0xCBB3, + 0x987B, 0xD0EB, + 0x987C, 0xE7EF, + 0x987D, 0xCDE7, + 0x987E, 0xB9CB, + 0x987F, 0xB6D9, + 0x9880, 0xF1FD, + 0x9881, 0xB0E4, + 0x9882, 0xCBCC, + 0x9883, 0xF1FE, + 0x9884, 0xD4A4, + 0x9885, 0xC2AD, + 0x9886, 0xC1EC, + 0x9887, 0xC6C4, + 0x9888, 0xBEB1, + 0x9889, 0xF2A1, + 0x988A, 0xBCD5, + 0x988C, 0xF2A2, + 0x988D, 0xF2A3, + 0x988F, 0xF2A4, + 0x9890, 0xD2C3, + 0x9891, 0xC6B5, + 0x9893, 0xCDC7, + 0x9894, 0xF2A5, + 0x9896, 0xD3B1, + 0x9897, 0xBFC5, + 0x9898, 0xCCE2, + 0x989A, 0xF2A6, + 0x989B, 0xF2A7, + 0x989C, 0xD1D5, + 0x989D, 0xB6EE, + 0x989E, 0xF2A8, + 0x989F, 0xF2A9, + 0x98A0, 0xB5DF, + 0x98A1, 0xF2AA, + 0x98A2, 0xF2AB, + 0x98A4, 0xB2FC, + 0x98A5, 0xF2AC, + 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, + 0x98CE, 0xB7E7, + 0x98D1, 0xECA9, + 0x98D2, 0xECAA, + 0x98D3, 0xECAB, + 0x98D5, 0xECAC, + 0x98D8, 0xC6AE, + 0x98D9, 0xECAD, + 0x98DA, 0xECAE, + 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, + 0x98E7, 0xE2B8, + 0x98E8, 0xF7CF, + 0x990D, 0xF7D0, + 0x9910, 0xB2CD, + 0x992E, 0xF7D1, + 0x9954, 0xF7D3, + 0x9955, 0xF7D2, + 0x9963, 0xE2BB, + 0x9965, 0xBCA2, + 0x9967, 0xE2BC, + 0x9968, 0xE2BD, + 0x9969, 0xE2BE, + 0x996A, 0xE2BF, + 0x996B, 0xE2C0, + 0x996C, 0xE2C1, + 0x996D, 0xB7B9, + 0x996E, 0xD2FB, + 0x996F, 0xBDA4, + 0x9970, 0xCACE, + 0x9971, 0xB1A5, + 0x9972, 0xCBC7, + 0x9974, 0xE2C2, + 0x9975, 0xB6FC, + 0x9976, 0xC8C4, + 0x9977, 0xE2C3, + 0x997A, 0xBDC8, + 0x997C, 0xB1FD, + 0x997D, 0xE2C4, + 0x997F, 0xB6F6, + 0x9980, 0xE2C5, + 0x9981, 0xC4D9, + 0x9984, 0xE2C6, + 0x9985, 0xCFDA, + 0x9986, 0xB9DD, + 0x9987, 0xE2C7, + 0x9988, 0xC0A1, + 0x998A, 0xE2C8, + 0x998B, 0xB2F6, + 0x998D, 0xE2C9, + 0x998F, 0xC1F3, + 0x9990, 0xE2CA, + 0x9991, 0xE2CB, + 0x9992, 0xC2F8, + 0x9993, 0xE2CC, + 0x9994, 0xE2CD, + 0x9995, 0xE2CE, + 0x9996, 0xCAD7, + 0x9997, 0xD8B8, + 0x9998, 0xD9E5, + 0x9999, 0xCFE3, + 0x99A5, 0xF0A5, + 0x99A8, 0xDCB0, + 0x9A6C, 0xC2ED, + 0x9A6D, 0xD4A6, + 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, + 0x9A70, 0xB3DB, + 0x9A71, 0xC7FD, + 0x9A73, 0xB2B5, + 0x9A74, 0xC2BF, + 0x9A75, 0xE6E0, + 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, + 0x9A78, 0xE6E2, + 0x9A79, 0xBED4, + 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, + 0x9A7C, 0xCDD5, + 0x9A7D, 0xE6E5, + 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, + 0x9A80, 0xE6E6, + 0x9A81, 0xE6E7, + 0x9A82, 0xC2EE, + 0x9A84, 0xBDBE, + 0x9A85, 0xE6E8, + 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, + 0x9A88, 0xE6E9, + 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, + 0x9A8C, 0xD1E9, + 0x9A8F, 0xBFA5, + 0x9A90, 0xE6EB, + 0x9A91, 0xC6EF, + 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, + 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, + 0x9A98, 0xE6EF, + 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, + 0x9A9C, 0xE6F1, + 0x9A9D, 0xE6F2, + 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, + 0x9AA0, 0xE6F4, + 0x9AA1, 0xC2E2, + 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, + 0x9AA4, 0xD6E8, + 0x9AA5, 0xE6F7, + 0x9AA7, 0xE6F8, + 0x9AA8, 0xB9C7, + 0x9AB0, 0xF7BB, + 0x9AB1, 0xF7BA, + 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, + 0x9AB8, 0xBAA1, + 0x9ABA, 0xF7BF, + 0x9ABC, 0xF7C0, + 0x9AC0, 0xF7C2, + 0x9AC1, 0xF7C1, + 0x9AC2, 0xF7C4, + 0x9AC5, 0xF7C3, + 0x9ACB, 0xF7C5, + 0x9ACC, 0xF7C6, + 0x9AD1, 0xF7C7, + 0x9AD3, 0xCBE8, + 0x9AD8, 0xB8DF, + 0x9ADF, 0xF7D4, + 0x9AE1, 0xF7D5, + 0x9AE6, 0xF7D6, + 0x9AEB, 0xF7D8, + 0x9AED, 0xF7DA, + 0x9AEF, 0xF7D7, + 0x9AF9, 0xF7DB, + 0x9AFB, 0xF7D9, + 0x9B03, 0xD7D7, + 0x9B08, 0xF7DC, + 0x9B0F, 0xF7DD, + 0x9B13, 0xF7DE, + 0x9B1F, 0xF7DF, + 0x9B23, 0xF7E0, + 0x9B2F, 0xDBCB, + 0x9B32, 0xD8AA, + 0x9B3B, 0xE5F7, + 0x9B3C, 0xB9ED, + 0x9B41, 0xBFFD, + 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, + 0x9B44, 0xC6C7, + 0x9B45, 0xF7C8, + 0x9B47, 0xF7CA, + 0x9B48, 0xF7CC, + 0x9B49, 0xF7CB, + 0x9B4D, 0xF7CD, + 0x9B4F, 0xCEBA, + 0x9B51, 0xF7CE, + 0x9B54, 0xC4A7, + 0x9C7C, 0xD3E3, + 0x9C7F, 0xF6CF, + 0x9C81, 0xC2B3, + 0x9C82, 0xF6D0, + 0x9C85, 0xF6D1, + 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, + 0x9C88, 0xF6D4, + 0x9C8B, 0xF6D6, + 0x9C8D, 0xB1AB, + 0x9C8E, 0xF6D7, + 0x9C90, 0xF6D8, + 0x9C91, 0xF6D9, + 0x9C92, 0xF6DA, + 0x9C94, 0xF6DB, + 0x9C95, 0xF6DC, + 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, + 0x9C9C, 0xCFCA, + 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, + 0x9CA0, 0xF6E1, + 0x9CA1, 0xF6E2, + 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, + 0x9CA4, 0xC0F0, + 0x9CA5, 0xF6E5, + 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, + 0x9CA8, 0xF6E8, + 0x9CA9, 0xF6E9, + 0x9CAB, 0xF6EA, + 0x9CAD, 0xF6EB, + 0x9CAE, 0xF6EC, + 0x9CB0, 0xF6ED, + 0x9CB1, 0xF6EE, + 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, + 0x9CB4, 0xF6F1, + 0x9CB5, 0xF6F2, + 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, + 0x9CB8, 0xBEA8, + 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, + 0x9CBC, 0xF6F7, + 0x9CBD, 0xF6F8, + 0x9CC3, 0xC8FA, + 0x9CC4, 0xF6F9, + 0x9CC5, 0xF6FA, + 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, + 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, + 0x9CCC, 0xF7A1, + 0x9CCD, 0xF7A2, + 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, + 0x9CD0, 0xF7A5, + 0x9CD3, 0xF7A6, + 0x9CD4, 0xF7A7, + 0x9CD5, 0xF7A8, + 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, + 0x9CD8, 0xF7AA, + 0x9CD9, 0xF7AB, + 0x9CDC, 0xF7AC, + 0x9CDD, 0xF7AD, + 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, + 0x9CE2, 0xF7AF, + 0x9E1F, 0xC4F1, + 0x9E20, 0xF0AF, + 0x9E21, 0xBCA6, + 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, + 0x9E25, 0xC5B8, + 0x9E26, 0xD1BB, + 0x9E28, 0xF0B1, + 0x9E29, 0xF0B2, + 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, + 0x9E2C, 0xF0B5, + 0x9E2D, 0xD1BC, + 0x9E2F, 0xD1EC, + 0x9E31, 0xF0B7, + 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, + 0x9E35, 0xCDD2, + 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, + 0x9E38, 0xF0B9, + 0x9E39, 0xF0BB, + 0x9E3A, 0xF0BC, + 0x9E3D, 0xB8EB, + 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, + 0x9E41, 0xF0BE, + 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, + 0x9E44, 0xF0C0, + 0x9E45, 0xB6EC, + 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, + 0x9E48, 0xF0C3, + 0x9E49, 0xF0C4, + 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, + 0x9E4C, 0xF0C6, + 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, + 0x9E51, 0xF0C8, + 0x9E55, 0xF0C9, + 0x9E57, 0xF0CA, + 0x9E58, 0xF7BD, + 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, + 0x9E5C, 0xF0CD, + 0x9E5E, 0xF0CE, + 0x9E63, 0xF0CF, + 0x9E64, 0xBAD7, + 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, + 0x9E68, 0xF0D2, + 0x9E69, 0xF0D3, + 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, + 0x9E6C, 0xF0D6, + 0x9E6D, 0xF0D8, + 0x9E70, 0xD3A5, + 0x9E71, 0xF0D7, + 0x9E73, 0xF0D9, + 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, + 0x9E82, 0xF7E4, + 0x9E87, 0xF7E5, + 0x9E88, 0xF7E6, + 0x9E8B, 0xF7E7, + 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, + 0x9E9D, 0xF7EA, + 0x9E9F, 0xF7EB, + 0x9EA6, 0xC2F3, + 0x9EB4, 0xF4F0, + 0x9EB8, 0xF4EF, + 0x9EBB, 0xC2E9, + 0x9EBD, 0xF7E1, + 0x9EBE, 0xF7E2, + 0x9EC4, 0xBBC6, + 0x9EC9, 0xD9E4, + 0x9ECD, 0xCAF2, + 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, + 0x9ED1, 0xBADA, + 0x9ED4, 0xC7AD, + 0x9ED8, 0xC4AC, + 0x9EDB, 0xF7EC, + 0x9EDC, 0xF7ED, + 0x9EDD, 0xF7EE, + 0x9EDF, 0xF7F0, + 0x9EE0, 0xF7EF, + 0x9EE2, 0xF7F1, + 0x9EE5, 0xF7F4, + 0x9EE7, 0xF7F3, + 0x9EE9, 0xF7F2, + 0x9EEA, 0xF7F5, + 0x9EEF, 0xF7F6, + 0x9EF9, 0xEDE9, + 0x9EFB, 0xEDEA, + 0x9EFC, 0xEDEB, + 0x9EFE, 0xF6BC, + 0x9F0B, 0xF6BD, + 0x9F0D, 0xF6BE, + 0x9F0E, 0xB6A6, + 0x9F10, 0xD8BE, + 0x9F13, 0xB9C4, + 0x9F17, 0xD8BB, + 0x9F19, 0xDCB1, + 0x9F20, 0xCAF3, + 0x9F22, 0xF7F7, + 0x9F2C, 0xF7F8, + 0x9F2F, 0xF7F9, + 0x9F37, 0xF7FB, + 0x9F39, 0xF7FA, + 0x9F3B, 0xB1C7, + 0x9F3D, 0xF7FC, + 0x9F3E, 0xF7FD, + 0x9F44, 0xF7FE, + 0x9F50, 0xC6EB, + 0x9F51, 0xECB4, + 0x9F7F, 0xB3DD, + 0x9F80, 0xF6B3, + 0x9F83, 0xF6B4, + 0x9F84, 0xC1E4, + 0x9F85, 0xF6B5, + 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, + 0x9F88, 0xF6B8, + 0x9F89, 0xF6B9, + 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, + 0x9F8C, 0xF6BB, + 0x9F99, 0xC1FA, + 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, + 0x9F9F, 0xB9EA, + 0x9FA0, 0xD9DF, + 0xFF01, 0xA3A1, + 0xFF02, 0xA3A2, + 0xFF03, 0xA3A3, + 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, + 0xFF06, 0xA3A6, + 0xFF07, 0xA3A7, + 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, + 0xFF0A, 0xA3AA, + 0xFF0B, 0xA3AB, + 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, + 0xFF0E, 0xA3AE, + 0xFF0F, 0xA3AF, + 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, + 0xFF12, 0xA3B2, + 0xFF13, 0xA3B3, + 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, + 0xFF16, 0xA3B6, + 0xFF17, 0xA3B7, + 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, + 0xFF1A, 0xA3BA, + 0xFF1B, 0xA3BB, + 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, + 0xFF1E, 0xA3BE, + 0xFF1F, 0xA3BF, + 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, + 0xFF22, 0xA3C2, + 0xFF23, 0xA3C3, + 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, + 0xFF26, 0xA3C6, + 0xFF27, 0xA3C7, + 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, + 0xFF2A, 0xA3CA, + 0xFF2B, 0xA3CB, + 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, + 0xFF2E, 0xA3CE, + 0xFF2F, 0xA3CF, + 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, + 0xFF32, 0xA3D2, + 0xFF33, 0xA3D3, + 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, + 0xFF36, 0xA3D6, + 0xFF37, 0xA3D7, + 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, + 0xFF3A, 0xA3DA, + 0xFF3B, 0xA3DB, + 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, + 0xFF3E, 0xA3DE, + 0xFF3F, 0xA3DF, + 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, + 0xFF42, 0xA3E2, + 0xFF43, 0xA3E3, + 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, + 0xFF46, 0xA3E6, + 0xFF47, 0xA3E7, + 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, + 0xFF4A, 0xA3EA, + 0xFF4B, 0xA3EB, + 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, + 0xFF4E, 0xA3EE, + 0xFF4F, 0xA3EF, + 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, + 0xFF52, 0xA3F2, + 0xFF53, 0xA3F3, + 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, + 0xFF56, 0xA3F6, + 0xFF57, 0xA3F7, + 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, + 0xFF5A, 0xA3FA, + 0xFF5B, 0xA3FB, + 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, + 0xFF5E, 0xA1AB, + 0xFFE0, 0xA1E9, + 0xFFE1, 0xA1EA, + 0xFFE3, 0xA3FE, + 0xFFE5, 0xA3A4 +}; diff --git a/backend/gs1.c b/backend/gs1.c new file mode 100644 index 0000000..dbad2ca --- /dev/null +++ b/backend/gs1.c @@ -0,0 +1,322 @@ +/* gs1.c - Verifies GS1 data */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#ifdef _MSC_VER +#include <malloc.h> +#endif +#include "common.h" +#include "gs1.h" + +/* This code does some checks on the integrity of GS1 data. It is not intended + to be bulletproof, nor does it report very accurately what problem was found + or where, but should prevent some of the more common encoding errors */ + +void itostr(char ai_string[], int ai_value) +{ + int thou, hund, ten, unit; + char temp[2]; + + strcpy(ai_string, "("); + thou = ai_value / 1000; + hund = (ai_value - (1000 * thou)) / 100; + ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10; + unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten)); + + temp[1] = '\0'; + if(ai_value >= 1000) { temp[0] = itoc(thou); concat(ai_string, temp); } + if(ai_value >= 100) { temp[0] = itoc(hund); concat(ai_string, temp); } + temp[0] = itoc(ten); + concat(ai_string, temp); + temp[0] = itoc(unit); + concat(ai_string, temp); + concat(ai_string, ")"); +} + +int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]) +{ + int i, j, last_ai, ai_latch; + char ai_string[6]; + int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; + int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100]; + int error_latch; + + /* Detect extended ASCII characters */ + for(i = 0; i < src_len; i++) { + if(source[i] >=128) { + strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1"); + return ERROR_INVALID_DATA; + } + if(source[i] < 32) { + strcpy(symbol->errtxt, "Control characters are not supported by GS1"); + return ERROR_INVALID_DATA; + } + } + + if(source[0] != '[') { + strcpy(symbol->errtxt, "Data does not start with an AI"); + return ERROR_INVALID_DATA; + } + + /* Check the position of the brackets */ + bracket_level = 0; + max_bracket_level = 0; + ai_length = 0; + max_ai_length = 0; + min_ai_length = 5; + j = 0; + ai_latch = 0; + for(i = 0; i < src_len; i++) { + ai_length += j; + if(((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; } + if(source[i] == '[') { bracket_level++; j = 1; } + if(source[i] == ']') { + bracket_level--; + if(ai_length < min_ai_length) { min_ai_length = ai_length; } + j = 0; + ai_length = 0; + } + if(bracket_level > max_bracket_level) { max_bracket_level = bracket_level; } + if(ai_length > max_ai_length) { max_ai_length = ai_length; } + } + min_ai_length--; + + if(bracket_level != 0) { + /* Not all brackets are closed */ + strcpy(symbol->errtxt, "Malformed AI in input data (brackets don\'t match)"); + return ERROR_INVALID_DATA; + } + + if(max_bracket_level > 1) { + /* Nested brackets */ + strcpy(symbol->errtxt, "Found nested brackets in input data"); + return ERROR_INVALID_DATA; + } + + if(max_ai_length > 4) { + /* AI is too long */ + strcpy(symbol->errtxt, "Invalid AI in input data (AI too long)"); + return ERROR_INVALID_DATA; + } + + if(min_ai_length <= 1) { + /* AI is too short */ + strcpy(symbol->errtxt, "Invalid AI in input data (AI too short)"); + return ERROR_INVALID_DATA; + } + + if(ai_latch == 1) { + /* Non-numeric data in AI */ + strcpy(symbol->errtxt, "Invalid AI in input data (non-numeric characters in AI)"); + return ERROR_INVALID_DATA; + } + + ai_count = 0; + for(i = 1; i < src_len; i++) { + if(source[i - 1] == '[') { + ai_location[ai_count] = i; + j = 0; + do { + ai_string[j] = source[i + j]; + j++; + } while (ai_string[j - 1] != ']'); + ai_string[j - 1] = '\0'; + ai_value[ai_count] = atoi(ai_string); + ai_count++; + } + } + + for(i = 0; i < ai_count; i++) { + data_location[i] = ai_location[i] + 3; + if(ai_value[i] >= 100) { data_location[i]++; } + if(ai_value[i] >= 1000) { data_location[i]++; } + data_length[i] = 0; + do { + data_length[i]++; + } while ((source[data_location[i] + data_length[i] - 1] != '[') && (source[data_location[i] + data_length[i] - 1] != '\0')); + data_length[i]--; + } + + for(i = 0; i < ai_count; i++) { + if(data_length[i] == 0) { + /* No data for given AI */ + strcpy(symbol->errtxt, "Empty data field in input data"); + return ERROR_INVALID_DATA; + } + } + + error_latch = 0; + strcpy(ai_string, ""); + for(i = 0; i < ai_count; i++) { + switch (ai_value[i]) { + case 0: if(data_length[i] != 18) { error_latch = 1; } break; + case 1: + case 2: + case 3: if(data_length[i] != 14) { error_latch = 1; } break; + case 4: if(data_length[i] != 16) { error_latch = 1; } break; + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: if(data_length[i] != 6) { error_latch = 1; } break; + case 20: if(data_length[i] != 2) { error_latch = 1; } break; + case 23: + case 24: + case 25: + case 39: + case 40: + case 41: + case 42: + case 70: + case 80: + case 81: error_latch = 2; break; + } + if( + ((ai_value[i] >= 100) && (ai_value[i] <= 179)) + || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799)) + || ((ai_value[i] >= 200) && (ai_value[i] <= 229)) + || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299)) + || ((ai_value[i] >= 300) && (ai_value[i] <= 309)) + || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099)) + || ((ai_value[i] >= 31) && (ai_value[i] <= 36)) + || ((ai_value[i] >= 310) && (ai_value[i] <= 369)) + ) { + error_latch = 2; + } + if((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) { + if(data_length[i] != 6) { + error_latch = 1; + } + } + if( + ((ai_value[i] >= 370) && (ai_value[i] <= 379)) + || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799)) + ) { + error_latch = 2; + } + if((ai_value[i] >= 410) && (ai_value[i] <= 415)) { + if(data_length[i] != 13) { + error_latch = 1; + } + } + if( + ((ai_value[i] >= 4100) && (ai_value[i] <= 4199)) + || ((ai_value[i] >= 700) && (ai_value[i] <= 703)) + || ((ai_value[i] >= 800) && (ai_value[i] <= 810)) + || ((ai_value[i] >= 900) && (ai_value[i] <= 999)) + || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999)) + ) { + error_latch = 2; + } + if((error_latch < 4) && (error_latch > 0)) { + /* error has just been detected: capture AI */ + itostr(ai_string, ai_value[i]); + error_latch += 4; + } + } + + if(error_latch == 5) { + strcpy(symbol->errtxt, "Invalid data length for AI "); + concat(symbol->errtxt, ai_string); + return ERROR_INVALID_DATA; + } + + if(error_latch == 6) { + strcpy(symbol->errtxt, "Invalid AI value "); + concat(symbol->errtxt, ai_string); + return ERROR_INVALID_DATA; + } + + /* Resolve AI data - put resulting string in 'reduced' */ + j = 0; + last_ai = 0; + ai_latch = 1; + for(i = 0; i < src_len; i++) { + if((source[i] != '[') && (source[i] != ']')) { + reduced[j++] = source[i]; + } + if(source[i] == '[') { + /* Start of an AI string */ + if(ai_latch == 0) { + reduced[j++] = '['; + } + ai_string[0] = source[i + 1]; + ai_string[1] = source[i + 2]; + ai_string[2] = '\0'; + last_ai = atoi(ai_string); + ai_latch = 0; + /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008" + figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */ + if( + ((last_ai >= 0) && (last_ai <= 4)) + || ((last_ai >= 11) && (last_ai <= 20)) + || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */ + || ((last_ai >= 31) && (last_ai <= 36)) + || (last_ai == 41) + ) { + ai_latch = 1; + } + } + /* The ']' character is simply dropped from the input */ + } + reduced[j] = '\0'; + + /* the character '[' in the reduced string refers to the FNC1 character */ + return 0; +} + +int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]) +{ + /* Only to keep the compiler happy */ +#ifndef _MSC_VER + char temp[src_len + 5]; +#else + char* temp = (char*)_alloca(src_len + 5); +#endif + int error_number; + + error_number = gs1_verify(symbol, source, src_len, temp); + if(error_number != 0) { return error_number; } + + if (strlen(temp) < src_len + 5) { + ustrcpy(reduced, (unsigned char*)temp); + return 0; + } + strcpy(symbol->errtxt, "ugs1_verify overflow"); + return ERROR_INVALID_DATA; +} diff --git a/backend/gs1.h b/backend/gs1.h new file mode 100644 index 0000000..8b345a2 --- /dev/null +++ b/backend/gs1.h @@ -0,0 +1,46 @@ +/* gs1.h - Verifies GS1 data */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ +#ifndef __GS1_H +#define __GS1_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]); +extern int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __GS1_H */
\ No newline at end of file diff --git a/backend/large.c b/backend/large.c new file mode 100644 index 0000000..ff44ecd --- /dev/null +++ b/backend/large.c @@ -0,0 +1,238 @@ +/* large.c - Handles binary manipulation of large numbers */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <stdio.h> +#include <string.h> +#include "common.h" +#include "large.h" + +static const short int BCD[40] = { + 0, 0, 0, 0, + 1, 0, 0, 0, + 0, 1, 0, 0, + 1, 1, 0, 0, + 0, 0, 1, 0, + 1, 0, 1, 0, + 0, 1, 1, 0, + 1, 1, 1, 0, + 0, 0, 0, 1, + 1, 0, 0, 1 }; + +void binary_add(short int accumulator[], short int input_buffer[]) +{ /* Binary addition */ + int i, carry, done; + carry = 0; + + for(i = 0; i < 112; i++) { + done = 0; + if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) { + accumulator[i] = 0; + carry = 0; + done = 1; + } + if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) { + accumulator[i] = 1; + carry = 0; + done = 1; + } + if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) { + accumulator[i] = 1; + carry = 0; + done = 1; + } + if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) { + accumulator[i] = 0; + carry = 1; + done = 1; + } + if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) { + accumulator[i] = 1; + carry = 0; + done = 1; + } + if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) { + accumulator[i] = 0; + carry = 1; + done = 1; + } + if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) { + accumulator[i] = 0; + carry = 1; + done = 1; + } + if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) { + accumulator[i] = 1; + carry = 1; + done = 1; + } + } +} + +void binary_subtract(short int accumulator[], short int input_buffer[]) +{ /* 2's compliment subtraction */ + /* take input_buffer from accumulator and put answer in accumulator */ + int i; + short int sub_buffer[112]; + + for(i = 0; i < 112; i++) { + if(input_buffer[i] == 0) { + sub_buffer[i] = 1; + } else { + sub_buffer[i] = 0; + } + } + binary_add(accumulator, sub_buffer); + + sub_buffer[0] = 1; + + for(i = 1; i < 112; i++) { + sub_buffer[i] = 0; + } + binary_add(accumulator, sub_buffer); +} + +void shiftdown(short int buffer[]) +{ + int i; + + buffer[102] = 0; + buffer[103] = 0; + + for(i = 0; i < 102; i++) { + buffer[i] = buffer[i + 1]; + } +} + +void shiftup(short int buffer[]) +{ + int i; + + for(i = 102; i > 0; i--) { + buffer[i] = buffer[i - 1]; + } + + buffer[0] = 0; +} + +short int islarger(short int accum[], short int reg[]) +{ + /* Returns 1 if accum[] is larger than reg[], else 0 */ + int i, latch, larger; + latch = 0; + i = 103; + larger = 0; + + + do { + if((accum[i] == 1) && (reg[i] == 0)) { + latch = 1; + larger = 1; + } + if((accum[i] == 0) && (reg[i] == 1)) { + latch = 1; + } + i--; + } while ((latch == 0) && (i >= -1)); + + return larger; +} + +void binary_load(short int reg[], char data[], const unsigned int src_len) +{ + int read, i; + short int temp[112] = { 0 }; + + for(i = 0; i < 112; i++) { + reg[i] = 0; + } + + for(read = 0; read < src_len; read++) { + + for(i = 0; i < 112; i++) { + temp[i] = reg[i]; + } + + for(i = 0; i < 9; i++) { + binary_add(reg, temp); + } + + temp[0] = BCD[ctoi(data[read]) * 4]; + temp[1] = BCD[(ctoi(data[read]) * 4) + 1]; + temp[2] = BCD[(ctoi(data[read]) * 4) + 2]; + temp[3] = BCD[(ctoi(data[read]) * 4) + 3]; + for(i = 4; i < 112; i++) { + temp[i] = 0; + } + + binary_add(reg, temp); + } +} + +void hex_dump(short int input_buffer[]) +{ + int i, digit, byte_space; + + byte_space = 1; + for(i = 100; i >= 0; i-=4) { + digit = 0; + digit += 1 * input_buffer[i]; + digit += 2 * input_buffer[i + 1]; + digit += 4 * input_buffer[i + 2]; + digit += 8 * input_buffer[i + 3]; + + switch(digit) { + case 0: printf("0"); break; + case 1: printf("1"); break; + case 2: printf("2"); break; + case 3: printf("3"); break; + case 4: printf("4"); break; + case 5: printf("5"); break; + case 6: printf("6"); break; + case 7: printf("7"); break; + case 8: printf("8"); break; + case 9: printf("9"); break; + case 10: printf("A"); break; + case 11: printf("B"); break; + case 12: printf("C"); break; + case 13: printf("D"); break; + case 14: printf("E"); break; + case 15: printf("F"); break; + } + if(byte_space == 1) { + byte_space = 0; + } else { + byte_space = 1; + printf(" "); + } + } + printf("\n"); +} diff --git a/backend/large.h b/backend/large.h new file mode 100644 index 0000000..74f9a61 --- /dev/null +++ b/backend/large.h @@ -0,0 +1,51 @@ +/* large.h - Handles binary manipulation of large numbers */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ +#ifndef __LARGE_H +#define __LARGE_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern void binary_load(short int reg[], char data[], const unsigned int src_len); +extern void binary_add(short int accumulator[], short int input_buffer[]); +extern void binary_subtract(short int accumulator[], short int input_buffer[]); +extern void shiftdown(short int buffer[]); +extern void shiftup(short int buffer[]); +extern short int islarger(short int accum[], short int reg[]); +extern void hex_dump(short int input_buffer[]); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __LARGE_H */ diff --git a/backend/library.c b/backend/library.c new file mode 100644 index 0000000..cbedb1f --- /dev/null +++ b/backend/library.c @@ -0,0 +1,722 @@ +/* library.c - external functions of libzint + + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#ifdef _MSC_VER +#include <malloc.h> +#endif +#include "common.h" +#include "gs1.h" + +#define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" + +struct zint_symbol *ZBarcode_Create() +{ + struct zint_symbol *symbol = (struct zint_symbol*)calloc(1, sizeof(struct zint_symbol)); + + if (!symbol) return NULL; + + symbol->symbology = BARCODE_CODE128; + strcpy(symbol->fgcolour, "000000"); + strcpy(symbol->bgcolour, "ffffff"); + strcpy(symbol->outfile, "out.png"); + symbol->scale = 1.0; + symbol->option_1 = -1; + symbol->option_3 = 928; // PDF_MAX + symbol->show_hrt = 1; // Show human readable text + return symbol; +} + +void ZBarcode_Clear(struct zint_symbol *symbol) +{ + int i, j; + + for(i = 0; i < symbol->rows; i++) { + for(j = 0; j < symbol->width; j++) { + unset_module(symbol, i, j); + } + } + symbol->rows = 0; + symbol->width = 0; + symbol->text[0] = '\0'; + symbol->errtxt[0] = '\0'; + if (symbol->bitmap != NULL) { + free(symbol->bitmap); + symbol->bitmap = NULL; + } + symbol->bitmap_width = 0; + symbol->bitmap_height = 0; +} + +void ZBarcode_Delete(struct zint_symbol *symbol) +{ + if (symbol->bitmap != NULL) + free(symbol->bitmap); + + // If there is a rendered version, ensure it's memory is released + if (symbol->rendered != NULL) { + struct zint_render_line *line, *l; + struct zint_render_string *string, *s; + + // Free lines + line = symbol->rendered->lines; + while(line) { + l = line; + line = line->next; + free(l); + } + // Free Strings + string = symbol->rendered->strings; + while (string) { + s = string; + string = string->next; + free(s->text); + free(s); + } + + // Free Render + free(symbol->rendered); + } + free(symbol); +} + +extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */ +extern int c39(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 3 from 9 (or Code 39) */ +extern int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Interleaved */ +extern int code_128(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 128 and NVE-18 */ +extern int qr_code(struct zint_symbol *symbol, unsigned char source[], int length); /* QR Code */ + +extern int render_plot(struct zint_symbol *symbol, float width, float height); + +extern int bmp_handle(struct zint_symbol *symbol, int rotate_angle); + +void error_tag(char error_string[], int error_number) +{ + char error_buffer[100]; + + if(error_number != 0) { + strcpy(error_buffer, error_string); + + if(error_number > 4) { + strcpy(error_string, "error: "); + } else { + strcpy(error_string, "warning: "); + } + + concat(error_string, error_buffer); + } +} + +int dump_plot(struct zint_symbol *symbol) +{ + FILE *f; + int i, r; + + if(symbol->output_options & BARCODE_STDOUT) { + f = stdout; + } else { + f = fopen(symbol->outfile, "w"); + if(!f) { + strcpy(symbol->errtxt, "Could not open output file"); + return ERROR_FILE_ACCESS; + } + } + + fputs("[\n", f); + for (r = 0; r < symbol->rows; r++) { + fputs(" [ ", f); + for (i = 0; i < symbol->width; i++) { + fputs(module_is_set(symbol, r, i) ? "1 " : "0 ", f); + } + fputs("]\n", f); + } + fputs("]\n", f); + + if(!(symbol->output_options & BARCODE_STDOUT)) + fclose(f); + + return 0; +} + +int hibc(struct zint_symbol *symbol, unsigned char source[], int length) +{ + int counter, error_number, i; + char to_process[40], temp[2], check_digit; + + if(length > 36) { + strcpy(symbol->errtxt, "Data too long for HIBC LIC"); + return ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(TECHNETIUM , source, length); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + + strcpy(to_process, "+"); + counter = 41; + for(i = 0; i < length; i++) { + counter += posn(TECHNETIUM, source[i]); + } + counter = counter % 43; + + if(counter < 10) { + check_digit = itoc(counter); + } else { + if(counter < 36) { + check_digit = (counter - 10) + 'A'; + } else { + switch(counter) { + case 36: check_digit = '-'; break; + case 37: check_digit = '.'; break; + case 38: check_digit = ' '; break; + case 39: check_digit = '$'; break; + case 40: check_digit = '/'; break; + case 41: check_digit = '+'; break; + case 42: check_digit = '%'; break; + default: check_digit = ' '; break; /* Keep compiler happy */ + } + } + } + + temp[0] = check_digit; + temp[1] = '\0'; + + concat(to_process, (char *)source); + concat(to_process, temp); + length = strlen(to_process); + + switch(symbol->symbology) { + case BARCODE_HIBC_128: + error_number = code_128(symbol, (unsigned char *)to_process, length); + ustrcpy(symbol->text, (unsigned char*)"*"); + uconcat(symbol->text, (unsigned char*)to_process); + uconcat(symbol->text, (unsigned char*)"*"); + break; + case BARCODE_HIBC_39: + symbol->option_2 = 0; + error_number = c39(symbol, (unsigned char *)to_process, length); + ustrcpy(symbol->text, (unsigned char*)"*"); + uconcat(symbol->text, (unsigned char*)to_process); + uconcat(symbol->text, (unsigned char*)"*"); + break; + case BARCODE_HIBC_QR: + error_number = qr_code(symbol, (unsigned char *)to_process, length); + break; + } + + return error_number; +} + +int gs1_compliant(int symbology) +{ + /* Returns 1 if symbology supports GS1 data */ + + int result = 0; + + switch(symbology) { + case BARCODE_EAN128: + case BARCODE_RSS_EXP: + case BARCODE_RSS_EXPSTACK: + case BARCODE_EANX_CC: + case BARCODE_EAN128_CC: + case BARCODE_RSS14_CC: + case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_EXP_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + case BARCODE_RSS_EXPSTACK_CC: + case BARCODE_CODE16K: + case BARCODE_AZTEC: + case BARCODE_DATAMATRIX: + case BARCODE_CODEONE: + case BARCODE_CODE49: + case BARCODE_QRCODE: + result = 1; + break; + } + + return result; +} + +int ZBarcode_ValidID(int symbol_id) +{ + /* Checks whether a symbology is supported */ + + int result = 0; + + switch(symbol_id) { + case BARCODE_CODE11: + case BARCODE_C25MATRIX: + case BARCODE_C25INTER: + case BARCODE_C25IATA: + case BARCODE_C25LOGIC: + case BARCODE_C25IND: + case BARCODE_CODE39: + case BARCODE_EXCODE39: + case BARCODE_EANX: + case BARCODE_EAN128: + case BARCODE_CODABAR: + case BARCODE_CODE128: + case BARCODE_DPLEIT: + case BARCODE_DPIDENT: + case BARCODE_CODE16K: + case BARCODE_CODE49: + case BARCODE_CODE93: + case BARCODE_FLAT: + case BARCODE_RSS14: + case BARCODE_RSS_LTD: + case BARCODE_RSS_EXP: + case BARCODE_TELEPEN: + case BARCODE_UPCA: + case BARCODE_UPCE: + case BARCODE_POSTNET: + case BARCODE_MSI_PLESSEY: + case BARCODE_FIM: + case BARCODE_LOGMARS: + case BARCODE_PHARMA: + case BARCODE_PZN: + case BARCODE_PHARMA_TWO: + case BARCODE_PDF417: + case BARCODE_PDF417TRUNC: + case BARCODE_MAXICODE: + case BARCODE_QRCODE: + case BARCODE_CODE128B: + case BARCODE_AUSPOST: + case BARCODE_AUSREPLY: + case BARCODE_AUSROUTE: + case BARCODE_AUSREDIRECT: + case BARCODE_ISBNX: + case BARCODE_RM4SCC: + case BARCODE_DATAMATRIX: + case BARCODE_EAN14: + case BARCODE_NVE18: + case BARCODE_JAPANPOST: + case BARCODE_KOREAPOST: + case BARCODE_RSS14STACK: + case BARCODE_RSS14STACK_OMNI: + case BARCODE_RSS_EXPSTACK: + case BARCODE_PLANET: + case BARCODE_MICROPDF417: + case BARCODE_ONECODE: + case BARCODE_PLESSEY: + case BARCODE_TELEPEN_NUM: + case BARCODE_ITF14: + case BARCODE_KIX: + case BARCODE_AZTEC: + case BARCODE_DAFT: + case BARCODE_MICROQR: + case BARCODE_HIBC_128: + case BARCODE_HIBC_39: + case BARCODE_HIBC_DM: + case BARCODE_HIBC_QR: + case BARCODE_HIBC_PDF: + case BARCODE_HIBC_MICPDF: + case BARCODE_HIBC_AZTEC: + case BARCODE_AZRUNE: + case BARCODE_CODE32: + case BARCODE_EANX_CC: + case BARCODE_EAN128_CC: + case BARCODE_RSS14_CC: + case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_EXP_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + case BARCODE_RSS_EXPSTACK_CC: + case BARCODE_CHANNEL: + case BARCODE_CODEONE: + case BARCODE_GRIDMATRIX: + result = 1; + break; + } + + return result; +} + +int extended_charset(struct zint_symbol *symbol, unsigned char *source, int length) +{ + int error_number = 0; + + /* These are the "elite" standards which can support multiple character sets */ + switch(symbol->symbology) { + case BARCODE_QRCODE: error_number = qr_code(symbol, source, length); break; + } + + return error_number; +} + +int reduced_charset(struct zint_symbol *symbol, unsigned char *source, int length) +{ + /* These are the "norm" standards which only support Latin-1 at most */ + int error_number = 0; + +#ifndef _MSC_VER + unsigned char preprocessed[length + 1]; +#else + unsigned char* preprocessed = (unsigned char*)_alloca(length + 1); +#endif + + if(symbol->symbology == BARCODE_CODE16K) { + symbol->whitespace_width = 16; + symbol->border_width = 2; + symbol->output_options = BARCODE_BIND; + } + + if(symbol->symbology == BARCODE_ITF14) { + symbol->whitespace_width = 20; + symbol->border_width = 8; + symbol->output_options = BARCODE_BOX; + } + + switch(symbol->input_mode) { + case DATA_MODE: + case GS1_MODE: + memcpy(preprocessed, source, length); + preprocessed[length] = '\0'; + break; + case UNICODE_MODE: + error_number = latin1_process(source, preprocessed, &length); + if(error_number != 0) { + strcpy(symbol->errtxt, "error: Invalid character in input string (only Latin-1 characters supported)"); + return error_number; + } + break; + } + + switch(symbol->symbology) { + case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, length); break; + case BARCODE_UPCA: error_number = eanx(symbol, preprocessed, length); break; + case BARCODE_UPCE: error_number = eanx(symbol, preprocessed, length); break; + case BARCODE_EANX: error_number = eanx(symbol, preprocessed, length); break; + case BARCODE_CODE39: error_number = c39(symbol, preprocessed, length); break; + case BARCODE_LOGMARS: error_number = c39(symbol, preprocessed, length); break; + case BARCODE_CODE128: error_number = code_128(symbol, preprocessed, length); break; + case BARCODE_CODE128B: error_number = code_128(symbol, preprocessed, length); break; + case BARCODE_ISBNX: error_number = eanx(symbol, preprocessed, length); break; + case BARCODE_HIBC_128: error_number = hibc(symbol, preprocessed, length); break; + case BARCODE_HIBC_39: error_number = hibc(symbol, preprocessed, length); break; + case BARCODE_HIBC_DM: error_number = hibc(symbol, preprocessed, length); break; + case BARCODE_HIBC_QR: error_number = hibc(symbol, preprocessed, length); break; + case BARCODE_HIBC_PDF: error_number = hibc(symbol, preprocessed, length); break; + case BARCODE_HIBC_MICPDF: error_number = hibc(symbol, preprocessed, length); break; + case BARCODE_HIBC_AZTEC: error_number = hibc(symbol, preprocessed, length); break; + } + + return error_number; +} + +int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *source, int length) +{ + int error_number, error_buffer, i; + error_number = 0; + + if(length == 0) { + length = ustrlen(source); + } + if(length == 0) { + strcpy(symbol->errtxt, "No input data"); + error_tag(symbol->errtxt, ERROR_INVALID_DATA); + return ERROR_INVALID_DATA; + } + + +#ifndef _MSC_VER + unsigned char local_source[length + 1]; +#else + unsigned char* local_source = (unsigned char*)_alloca(length + 1); +#endif + + /* First check the symbology field */ + if(symbol->symbology < 1) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } + + /* symbol->symbologys 1 to 86 are defined by tbarcode */ + if(symbol->symbology == 5) { symbol->symbology = BARCODE_C25MATRIX; } + if((symbol->symbology >= 10) && (symbol->symbology <= 12)) { symbol->symbology = BARCODE_EANX; } + if((symbol->symbology == 14) || (symbol->symbology == 15)) { symbol->symbology = BARCODE_EANX; } + if(symbol->symbology == 17) { symbol->symbology = BARCODE_UPCA; } + if(symbol->symbology == 19) { strcpy(symbol->errtxt, "Codabar 18 not supported, using Codabar"); symbol->symbology = BARCODE_CODABAR; error_number = WARN_INVALID_OPTION; } + if(symbol->symbology == 26) { symbol->symbology = BARCODE_UPCA; } + if(symbol->symbology == 27) { strcpy(symbol->errtxt, "UPCD1 not supported"); error_number = ERROR_INVALID_OPTION; } + if(symbol->symbology == 33) { symbol->symbology = BARCODE_EAN128; } + if((symbol->symbology == 35) || (symbol->symbology == 36)) { symbol->symbology = BARCODE_UPCA; } + if((symbol->symbology == 38) || (symbol->symbology == 39)) { symbol->symbology = BARCODE_UPCE; } + if((symbol->symbology >= 41) && (symbol->symbology <= 45)) { symbol->symbology = BARCODE_POSTNET; } + if(symbol->symbology == 46) { symbol->symbology = BARCODE_PLESSEY; } + if(symbol->symbology == 48) { symbol->symbology = BARCODE_NVE18; } + if(symbol->symbology == 54) { strcpy(symbol->errtxt, "General Parcel Code not supported, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } + if((symbol->symbology == 59) || (symbol->symbology == 61)) { symbol->symbology = BARCODE_CODE128; } + if(symbol->symbology == 62) { symbol->symbology = BARCODE_CODE93; } + if((symbol->symbology == 64) || (symbol->symbology == 65)) { symbol->symbology = BARCODE_AUSPOST; } + if(symbol->symbology == 73) { strcpy(symbol->errtxt, "Codablock E not supported"); error_number = ERROR_INVALID_OPTION; } + if(symbol->symbology == 78) { symbol->symbology = BARCODE_RSS14; } + if(symbol->symbology == 83) { symbol->symbology = BARCODE_PLANET; } + if(symbol->symbology == 88) { symbol->symbology = BARCODE_EAN128; } + if(symbol->symbology == 91) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } + if((symbol->symbology >= 94) && (symbol->symbology <= 96)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } + if(symbol->symbology == 100) { symbol->symbology = BARCODE_HIBC_128; } + if(symbol->symbology == 101) { symbol->symbology = BARCODE_HIBC_39; } + if(symbol->symbology == 103) { symbol->symbology = BARCODE_HIBC_DM; } + if(symbol->symbology == 105) { symbol->symbology = BARCODE_HIBC_QR; } + if(symbol->symbology == 107) { symbol->symbology = BARCODE_HIBC_PDF; } + if(symbol->symbology == 109) { symbol->symbology = BARCODE_HIBC_MICPDF; } + if(symbol->symbology == 111) { symbol->symbology = BARCODE_HIBC_BLOCKF; } + if((symbol->symbology >= 113) && (symbol->symbology <= 127)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } + /* Everything from 128 up is Zint-specific */ + if(symbol->symbology >= 143) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } + if((symbol->symbology == BARCODE_CODABLOCKF) || (symbol->symbology == BARCODE_HIBC_BLOCKF)) { strcpy(symbol->errtxt, "Codablock F not supported"); error_number = ERROR_INVALID_OPTION; } + + if(error_number > 4) { + error_tag(symbol->errtxt, error_number); + return error_number; + } else { + error_buffer = error_number; + } + + if((symbol->input_mode < 0) || (symbol->input_mode > 2)) { symbol->input_mode = DATA_MODE; } + + if(symbol->input_mode == GS1_MODE) { + for(i = 0; i < length; i++) { + if(source[i] == '\0') { + strcpy(symbol->errtxt, "NULL characters not permitted in GS1 mode"); + return ERROR_INVALID_DATA; + } + } + if(gs1_compliant(symbol->symbology) == 1) { + error_number = ugs1_verify(symbol, source, length, local_source); + if(error_number != 0) { return error_number; } + length = ustrlen(local_source); + } else { + strcpy(symbol->errtxt, "Selected symbology does not support GS1 mode"); + return ERROR_INVALID_OPTION; + } + } else { + memcpy(local_source, source, length); + local_source[length] = '\0'; + } + + switch(symbol->symbology) { + case BARCODE_QRCODE: + case BARCODE_MICROQR: + case BARCODE_GRIDMATRIX: + error_number = extended_charset(symbol, local_source, length); + break; + default: + error_number = reduced_charset(symbol, local_source, length); + break; + } + + if((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) { + for(i = 0; i < length; i++) { + if(local_source[i] == '\0') { + symbol->text[i] = ' '; + } else { + symbol->text[i] = local_source[i]; + } + } + } + + if(error_number == 0) { + error_number = error_buffer; + } + error_tag(symbol->errtxt, error_number); + /*printf("%s\n",symbol->text);*/ + return error_number; +} + +int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) +{ + return ERROR_INVALID_OPTION; +} + +int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle) +{ + int error_number; + + switch(rotate_angle) { + case 0: + case 90: + case 180: + case 270: + break; + default: + strcpy(symbol->errtxt, "Invalid rotation angle"); + return ERROR_INVALID_OPTION; + break; + } + + error_number = bmp_handle(symbol, rotate_angle); + error_tag(symbol->errtxt, error_number); + return error_number; +} + +int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) +{ + int error_number; + + error_number = 0; + + error_number = ZBarcode_Encode(symbol, input, length); + if(error_number != 0) { + return error_number; + } + + error_number = ZBarcode_Print(symbol, rotate_angle); + return error_number; +} + +int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) +{ + int error_number; + + error_number = 0; + + error_number = ZBarcode_Encode(symbol, input, length); + if(error_number != 0) { + return error_number; + } + + error_number = ZBarcode_Buffer(symbol, rotate_angle); + return error_number; +} + +int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) +{ + FILE *file; + unsigned char *buffer; + unsigned long fileLen; + unsigned int nRead = 0, n = 0; + int ret; + + if (!strcmp(filename, "-")) { + file = stdin; + fileLen = 7100; + } else { + file = fopen(filename, "rb"); + if (!file) { + strcpy(symbol->errtxt, "Unable to read input file"); + return ERROR_INVALID_DATA; + } + + /* Get file length */ + fseek(file, 0, SEEK_END); + fileLen = ftell(file); + fseek(file, 0, SEEK_SET); + + if(fileLen > 7100) { + /* The largest amount of data that can be encoded is 7089 numeric digits in QR Code */ + strcpy(symbol->errtxt, "Input file too long"); + fclose(file); + return ERROR_INVALID_DATA; + } + } + + /* Allocate memory */ + buffer = (unsigned char *)malloc(fileLen * sizeof(unsigned char)); + if(!buffer) { + strcpy(symbol->errtxt, "Internal memory error"); + if (strcmp(filename, "-")) + fclose(file); + return ERROR_MEMORY; + } + + /* Read file contents into buffer */ + + do + { + n = fread(buffer + nRead, 1, fileLen - nRead, file); + if (ferror(file)) + { + strcpy(symbol->errtxt, strerror(errno)); + nRead = 0; + return ERROR_INVALID_DATA; + } + nRead += n; + } while (!feof(file) && (0 < n) && (nRead < fileLen)); + + if (strcmp(filename, "-")) + fclose(file); + + ret = ZBarcode_Encode(symbol, buffer, nRead); + free(buffer); + return ret; +} + +int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle) +{ + int error_number; + + error_number = 0; + + error_number = ZBarcode_Encode_File(symbol, filename); + if(error_number != 0) { + return error_number; + } + + return ZBarcode_Print(symbol, rotate_angle); +} + +int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle) +{ + int error_number; + + error_number = 0; + + error_number = ZBarcode_Encode_File(symbol, filename); + if(error_number != 0) { + return error_number; + } + + return ZBarcode_Buffer(symbol, rotate_angle); +} + +/* + * Rendering support, initially added by Sam Lown. + * + * Converts encoded data into an intermediate format to be interpreted + * in other applications using this library. + * + * If the width and height are not set to zero, the barcode will be resized to those + * dimensions. The symbol->scale and symbol->height values are totally ignored in this case. + * + */ +int ZBarcode_Render(struct zint_symbol *symbol, float width, float height) +{ + // Send the request to the render_plot method + return render_plot(symbol, width, height); +} diff --git a/backend/libzint.la b/backend/libzint.la new file mode 100644 index 0000000..d077ad1 --- /dev/null +++ b/backend/libzint.la @@ -0,0 +1,40 @@ +# libzint.la - a libtool library file +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='../bin/zint.dll' + +# Names of this library. +library_names='libzint.dll.a' + +# The name of the static archive. +old_library='libzint.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libz. +current=2 +age=4 +revision=1 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/mingw/lib' diff --git a/backend/libzint.rc b/backend/libzint.rc new file mode 100644 index 0000000..1930f69 --- /dev/null +++ b/backend/libzint.rc @@ -0,0 +1,40 @@ +#include <windows.h>
+
+#ifdef GCC_WINDRES
+VS_VERSION_INFO VERSIONINFO
+#else
+VS_VERSION_INFO VERSIONINFO
+#endif
+ FILEVERSION 2,3,0,0
+ PRODUCTVERSION 2,3,0,0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0
+#endif
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+ BEGIN
+ VALUE "FileDescription", "libzint barcode library\0"
+ VALUE "FileVersion", "2.3.0.0\0"
+ VALUE "InternalName", "zint.dll\0"
+ VALUE "LegalCopyright", "Copyright © 2009 Robin Stuart & BogDan Vatra\0"
+ VALUE "OriginalFilename", "zint.dll\0"
+ VALUE "ProductName", "libzint\0"
+ VALUE "ProductVersion", "2.3.0.0\0"
+ VALUE "License", "BSD License version 3\0"
+ VALUE "WWW", "http://www.sourceforge.net/projects/zint\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1250
+ END
+END
diff --git a/backend/maxipng.h b/backend/maxipng.h new file mode 100644 index 0000000..f39c51e --- /dev/null +++ b/backend/maxipng.h @@ -0,0 +1,149 @@ +/* maxipng.h - Shapes for Maxicode output to PNG file */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +/* This file contains the pixel-by-pixel representation of maxicode glyphs + at a resolution of 12 pixels per millimeter. hexagon[] is taken directly + from ISO 16023 Annex J. bullseye[] was calculated by the Gimp */ + +#define SSET "0123456789ABCDEF" + +static const int hexagon[120] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const unsigned int bullseye_compressed[] = { + 0,0,0,0,0,255,248,0,0,0,0,0, + 0,0,0,0,31,255,255,192,0,0,0,0, + 0,0,0,1,255,255,255,252,0,0,0,0, + 0,0,0,7,255,255,255,255,0,0,0,0, + 0,0,0,31,255,255,255,255,192,0,0,0, + 0,0,0,127,255,255,255,255,240,0,0,0, + 0,0,1,255,255,255,255,255,252,0,0,0, + 0,0,7,255,255,255,255,255,255,0,0,0, + 0,0,15,255,255,0,7,255,255,128,0,0, + 0,0,63,255,240,0,0,127,255,224,0,0, + 0,0,127,255,128,0,0,15,255,240,0,0, + 0,0,255,252,0,0,0,1,255,248,0,0, + 0,1,255,240,0,0,0,0,127,252,0,0, + 0,3,255,224,0,0,0,0,63,254,0,0, + 0,7,255,128,0,0,0,0,15,255,0,0, + 0,15,255,0,0,0,0,0,7,255,128,0, + 0,31,252,0,0,127,240,0,1,255,192,0, + 0,63,248,0,7,255,255,0,0,255,224,0, + 0,127,240,0,63,255,255,224,0,127,240,0, + 0,127,224,0,255,255,255,248,0,63,240,0, + 0,255,192,1,255,255,255,252,0,31,248,0, + 1,255,128,7,255,255,255,255,0,15,252,0, + 1,255,0,15,255,255,255,255,128,7,252,0, + 3,255,0,63,255,255,255,255,224,7,254,0, + 3,254,0,127,255,192,31,255,240,3,254,0, + 7,252,0,255,252,0,1,255,248,1,255,0, + 7,252,1,255,240,0,0,127,252,1,255,0, + 15,248,1,255,192,0,0,31,252,0,255,128, + 15,240,3,255,128,0,0,15,254,0,127,128, + 31,240,7,255,0,0,0,7,255,0,127,192, + 31,224,7,254,0,0,0,3,255,0,63,192, + 63,224,15,252,0,0,0,1,255,128,63,224, + 63,224,31,248,0,63,192,0,255,192,63,224, + 63,192,31,240,0,255,240,0,127,192,31,224, + 63,192,63,224,3,255,252,0,63,224,31,224, + 127,192,63,224,7,255,254,0,63,224,31,240, + 127,128,63,192,15,255,255,0,31,224,15,240, + 127,128,127,192,31,255,255,128,31,240,15,240, + 127,128,127,128,63,255,255,192,15,240,15,240, + 127,128,127,128,63,255,255,192,15,240,15,240, + 255,0,127,128,127,240,255,224,15,240,7,240, + 255,0,255,128,127,192,63,224,15,248,7,240, + 255,0,255,0,255,128,31,240,7,248,7,240, + 255,0,255,0,255,128,31,240,7,248,7,240, + 255,0,255,0,255,0,15,240,7,248,7,240, + 255,0,255,0,255,0,15,240,7,248,7,240, + 255,0,255,0,255,0,15,240,7,248,7,240, + 255,0,255,0,255,0,15,240,7,248,7,240, + 255,0,255,0,255,128,31,240,7,248,7,240, + 255,0,255,0,255,128,31,240,7,248,7,240, + 255,0,255,0,127,192,63,224,7,248,7,240, + 255,0,255,128,127,240,255,224,15,248,7,240, + 255,0,127,128,63,255,255,192,15,240,7,240, + 127,128,127,128,63,255,255,192,15,240,15,240, + 127,128,127,128,31,255,255,128,15,240,15,240, + 127,128,127,192,15,255,255,0,31,240,15,240, + 127,128,63,192,7,255,254,0,31,224,15,240, + 127,192,63,224,3,255,252,0,63,224,31,240, + 63,192,63,224,0,255,240,0,63,224,31,224, + 63,192,31,240,0,63,192,0,127,192,31,224, + 63,224,31,248,0,0,0,0,255,192,63,224, + 63,224,15,252,0,0,0,1,255,128,63,224, + 31,224,7,254,0,0,0,3,255,0,63,192, + 31,240,7,255,0,0,0,7,255,0,127,192, + 15,240,3,255,128,0,0,15,254,0,127,128, + 15,248,1,255,192,0,0,31,252,0,255,128, + 7,252,1,255,240,0,0,127,252,1,255,0, + 7,252,0,255,252,0,1,255,248,1,255,0, + 3,254,0,127,255,192,31,255,240,3,254,0, + 3,255,0,63,255,255,255,255,224,7,254,0, + 1,255,0,15,255,255,255,255,128,7,252,0, + 1,255,128,7,255,255,255,255,0,15,252,0, + 0,255,192,1,255,255,255,252,0,31,248,0, + 0,127,224,0,255,255,255,248,0,63,240,0, + 0,127,240,0,63,255,255,224,0,127,240,0, + 0,63,248,0,7,255,255,0,0,255,224,0, + 0,31,252,0,0,127,240,0,1,255,192,0, + 0,15,255,0,0,0,0,0,7,255,128,0, + 0,7,255,128,0,0,0,0,15,255,0,0, + 0,3,255,224,0,0,0,0,63,254,0,0, + 0,1,255,240,0,0,0,0,127,252,0,0, + 0,0,255,252,0,0,0,1,255,248,0,0, + 0,0,127,255,128,0,0,15,255,240,0,0, + 0,0,63,255,240,0,0,127,255,224,0,0, + 0,0,15,255,255,0,7,255,255,128,0,0, + 0,0,7,255,255,255,255,255,255,0,0,0, + 0,0,1,255,255,255,255,255,252,0,0,0, + 0,0,0,127,255,255,255,255,240,0,0,0, + 0,0,0,31,255,255,255,255,192,0,0,0, + 0,0,0,7,255,255,255,255,0,0,0,0, + 0,0,0,1,255,255,255,252,0,0,0,0, + 0,0,0,0,31,255,255,192,0,0,0,0, + 0,0,0,0,0,255,248,0,0,0,0,0 +}; + diff --git a/backend/png.c b/backend/png.c new file mode 100644 index 0000000..e3522fe --- /dev/null +++ b/backend/png.c @@ -0,0 +1,1146 @@ +/* png.c - Handles output to PNG file */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <stdio.h> +#ifdef _MSC_VER +#include <fcntl.h> +#include <io.h> +#endif +#include <stdlib.h> +#include <string.h> +#include "common.h" + +#ifdef _MSC_VER +#include <malloc.h> +#endif /* _MSC_VER */ + +#ifndef NO_PNG +#include "png.h" /* libpng header; includes zlib.h and setjmp.h */ +#endif /* NO_PNG */ +#include "maxipng.h" /* Maxicode shapes */ + +#include "font.h" /* Font for human readable text */ + +#define SSET "0123456789ABCDEF" + +#define PNG_DATA 100 +#define BMP_DATA 200 + +#ifndef NO_PNG +struct mainprog_info_type { + long width; + long height; + FILE *outfile; + jmp_buf jmpbuf; +}; + +static void writepng_error_handler(png_structp png_ptr, png_const_charp msg) +{ + struct mainprog_info_type *graphic; + + fprintf(stderr, "writepng libpng error: %s\n", msg); + fflush(stderr); + + graphic = (struct mainprog_info_type*)png_get_error_ptr(png_ptr); + if (graphic == NULL) { /* we are completely hosed now */ + fprintf(stderr, + "writepng severe error: jmpbuf not recoverable; terminating.\n"); + fflush(stderr); + return; + } + longjmp(graphic->jmpbuf, 1); +} + +int png_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle) +{ + struct mainprog_info_type wpng_info; + struct mainprog_info_type *graphic; + +#ifndef _MSC_VER + unsigned char outdata[image_width * 3]; +#else + unsigned char* outdata = (unsigned char*)_alloca(image_width * 3); +#endif + png_structp png_ptr; + png_infop info_ptr; + graphic = &wpng_info; + unsigned char *image_data; + int i, row, column, err_no; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + + switch(rotate_angle) { + case 0: + case 180: + graphic->width = image_width; + graphic->height = image_height; + break; + case 90: + case 270: + graphic->width = image_height; + graphic->height = image_width; + break; + } + + /* sort out colour options */ + to_upper((unsigned char*)symbol->fgcolour); + to_upper((unsigned char*)symbol->bgcolour); + + if(strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "Malformed foreground colour target"); + return ERROR_INVALID_OPTION; + } + if(strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "Malformed background colour target"); + return ERROR_INVALID_OPTION; + } + err_no = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); + if (err_no == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Malformed foreground colour target"); + return ERROR_INVALID_OPTION; + } + err_no = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour)); + if (err_no == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Malformed background colour target"); + return ERROR_INVALID_OPTION; + } + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + /* Open output file in binary mode */ + if((symbol->output_options & BARCODE_STDOUT) != 0) { +#ifdef _MSC_VER + if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { + strcpy(symbol->errtxt, "Can't open output file"); + return ERROR_FILE_ACCESS; + } +#endif + graphic->outfile = stdout; + } else { + if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) { + strcpy(symbol->errtxt, "Can't open output file"); + return ERROR_FILE_ACCESS; + } + } + + /* Set up error handling routine as proc() above */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic, writepng_error_handler, NULL); + if (!png_ptr) { + strcpy(symbol->errtxt, "Out of memory"); + return ERROR_MEMORY; + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + png_destroy_write_struct(&png_ptr, NULL); + strcpy(symbol->errtxt, "Out of memory"); + return ERROR_MEMORY; + } + + /* catch jumping here */ + if (setjmp(graphic->jmpbuf)) { + png_destroy_write_struct(&png_ptr, &info_ptr); + strcpy(symbol->errtxt, "libpng error occurred"); + return ERROR_MEMORY; + } + + /* open output file with libpng */ + png_init_io(png_ptr, graphic->outfile); + + /* set compression */ + png_set_compression_level(png_ptr,9); + + /* set Header block */ + png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + /* write all chunks up to (but not including) first IDAT */ + png_write_info(png_ptr, info_ptr); + + /* set up the transformations: for now, just pack low-bit-depth pixels + into bytes (one, two or four pixels per byte) */ + png_set_packing(png_ptr); + + /* Pixel Plotting */ + + switch(rotate_angle) { + case 0: /* Plot the right way up */ + for(row = 0; row < image_height; row++) { + for(column = 0; column < image_width; column++) { + i = column * 3; + switch(*(pixelbuf + (image_width * row) + column)) + { + case '1': + outdata[i] = fgred; + outdata[i + 1] = fggrn; + outdata[i + 2] = fgblu; + break; + default: + outdata[i] = bgred; + outdata[i + 1] = bggrn; + outdata[i + 2] = bgblu; + break; + + } + } + /* write row contents to file */ + image_data = outdata; + png_write_row(png_ptr, image_data); + } + break; + case 90: /* Plot 90 degrees clockwise */ + for(row = 0; row < image_width; row++) { + for(column = 0; column < image_height; column++) { + i = column * 3; + switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row)) + { + case '1': + outdata[i] = fgred; + outdata[i + 1] = fggrn; + outdata[i + 2] = fgblu; + break; + default: + outdata[i] = bgred; + outdata[i + 1] = bggrn; + outdata[i + 2] = bgblu; + break; + + } + } + + /* write row contents to file */ + image_data = outdata; + png_write_row(png_ptr, image_data); + } + break; + case 180: /* Plot upside down */ + for(row = 0; row < image_height; row++) { + for(column = 0; column < image_width; column++) { + i = column * 3; + switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1))) + { + case '1': + outdata[i] = fgred; + outdata[i + 1] = fggrn; + outdata[i + 2] = fgblu; + break; + default: + outdata[i] = bgred; + outdata[i + 1] = bggrn; + outdata[i + 2] = bgblu; + break; + + } + } + + /* write row contents to file */ + image_data = outdata; + png_write_row(png_ptr, image_data); + } + break; + case 270: /* Plot 90 degrees anti-clockwise */ + for(row = 0; row < image_width; row++) { + for(column = 0; column < image_height; column++) { + i = column * 3; + switch(*(pixelbuf + (image_width * column) + (image_width - row - 1))) + { + case '1': + outdata[i] = fgred; + outdata[i + 1] = fggrn; + outdata[i + 2] = fgblu; + break; + default: + outdata[i] = bgred; + outdata[i + 1] = bggrn; + outdata[i + 2] = bgblu; + break; + + } + } + + /* write row contents to file */ + image_data = outdata; + png_write_row(png_ptr, image_data); + } + break; + } + + /* End the file */ + png_write_end(png_ptr, NULL); + + /* make sure we have disengaged */ + if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(wpng_info.outfile); + return 0; +} +#endif /* NO_PNG */ + +int bmp_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle) +{ + int i, row, column, err_no; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + + switch(rotate_angle) { + case 0: + case 180: + symbol->bitmap_width = image_width; + symbol->bitmap_height = image_height; + break; + case 90: + case 270: + symbol->bitmap_width = image_height; + symbol->bitmap_height = image_width; + break; + } + + if (symbol->bitmap != NULL) + free(symbol->bitmap); + + symbol->bitmap = (char *) malloc(image_width * image_height * 3); + + + /* sort out colour options */ + to_upper((unsigned char*)symbol->fgcolour); + to_upper((unsigned char*)symbol->bgcolour); + + if(strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "Malformed foreground colour target"); + return ERROR_INVALID_OPTION; + } + if(strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "Malformed background colour target"); + return ERROR_INVALID_OPTION; + } + err_no = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); + if (err_no == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Malformed foreground colour target"); + return ERROR_INVALID_OPTION; + } + err_no = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->fgcolour)); + if (err_no == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Malformed background colour target"); + return ERROR_INVALID_OPTION; + } + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + /* Pixel Plotting */ + i = 0; + switch(rotate_angle) { + case 0: /* Plot the right way up */ + for(row = 0; row < image_height; row++) { + for(column = 0; column < image_width; column++) { + switch(*(pixelbuf + (image_width * row) + column)) + { + case '1': + symbol->bitmap[i++] = fgred; + symbol->bitmap[i++] = fggrn; + symbol->bitmap[i++] = fgblu; + break; + default: + symbol->bitmap[i++] = bgred; + symbol->bitmap[i++] = bggrn; + symbol->bitmap[i++] = bgblu; + break; + + } + } + } + break; + case 90: /* Plot 90 degrees clockwise */ + for(row = 0; row < image_width; row++) { + for(column = 0; column < image_height; column++) { + switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row)) + { + case '1': + symbol->bitmap[i++] = fgred; + symbol->bitmap[i++] = fggrn; + symbol->bitmap[i++] = fgblu; + break; + default: + symbol->bitmap[i++] = bgred; + symbol->bitmap[i++] = bggrn; + symbol->bitmap[i++] = bgblu; + break; + + } + } + } + break; + case 180: /* Plot upside down */ + for(row = 0; row < image_height; row++) { + for(column = 0; column < image_width; column++) { + switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1))) + { + case '1': + symbol->bitmap[i++] = fgred; + symbol->bitmap[i++] = fggrn; + symbol->bitmap[i++] = fgblu; + break; + default: + symbol->bitmap[i++] = bgred; + symbol->bitmap[i++] = bggrn; + symbol->bitmap[i++] = bgblu; + break; + + } + } + } + break; + case 270: /* Plot 90 degrees anti-clockwise */ + for(row = 0; row < image_width; row++) { + for(column = 0; column < image_height; column++) { + switch(*(pixelbuf + (image_width * column) + (image_width - row - 1))) + { + case '1': + symbol->bitmap[i++] = fgred; + symbol->bitmap[i++] = fggrn; + symbol->bitmap[i++] = fgblu; + break; + default: + symbol->bitmap[i++] = bgred; + symbol->bitmap[i++] = bggrn; + symbol->bitmap[i++] = bgblu; + break; + + } + } + } + break; + } + + return 0; +} + +int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type) +{ + int error_number; + float scaler = symbol->scale; + char *scaled_pixelbuf; + int horiz, vert; + int scale_width, scale_height; + + if(scaler == 0) { scaler = 0.5; } + scale_width = image_width * scaler; + scale_height = image_height * scaler; + + /* Apply scale options by creating another pixel buffer */ + if ((scaled_pixelbuf = (char *) malloc(scale_width * scale_height)) == NULL) { + printf("Insufficient memory for pixel buffer"); + return ERROR_ENCODING_PROBLEM; + } + memset(scaled_pixelbuf, '0', scale_width * scale_height); + + for(vert = 0; vert < scale_height; vert++) { + for(horiz = 0; horiz < scale_width; horiz++) { + *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + ((int)(vert / scaler) * image_width) + (int)(horiz / scaler)); + } + } + + if(image_type == PNG_DATA) { +#ifndef NO_PNG + error_number = png_pixel_plot(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle); +#else + error_number = ERROR_INVALID_OPTION; +#endif + } else { + error_number = bmp_pixel_plot(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle); + } + + free(scaled_pixelbuf); + + return error_number; +} + +void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height) +{ + /* Draw a rectangle */ + int i, j, png_ypos; + + png_ypos = image_height - ypos - ylen; + /* This fudge is needed because EPS measures height from the bottom up but + PNG measures y position from the top down */ + + for(i = (xpos); i < (xpos + xlen); i++) { + for( j = (png_ypos); j < (png_ypos + ylen); j++) { + *(pixelbuf + (image_width * j) + i) = '1'; + } + } +} + +int bullseye_pixel(int row, int col) { + int block_val, block_pos, return_val; + + block_val = bullseye_compressed[(row * 12) + (col / 8)]; + return_val = 0; + block_pos = col % 8; + + switch(block_pos) { + case 0: if((block_val & 0x80) != 0) { return_val = 1; } break; + case 1: if((block_val & 0x40) != 0) { return_val = 1; } break; + case 2: if((block_val & 0x20) != 0) { return_val = 1; } break; + case 3: if((block_val & 0x10) != 0) { return_val = 1; } break; + case 4: if((block_val & 0x08) != 0) { return_val = 1; } break; + case 5: if((block_val & 0x04) != 0) { return_val = 1; } break; + case 6: if((block_val & 0x02) != 0) { return_val = 1; } break; + case 7: if((block_val & 0x01) != 0) { return_val = 1; } break; + } + + return return_val; +} + +void draw_bullseye(char *pixelbuf, int image_width, int xoffset, int yoffset) +{ + /* Central bullseye in Maxicode symbols */ + int i, j; + + for(j = 103; j < 196; j++) { + for(i = 0; i < 93; i++) { + if(bullseye_pixel(j - 103, i)) { + /* if(bullseye[(((j - 103) * 93) + i)] == 1) { */ + *(pixelbuf + (image_width * j) + (image_width * yoffset) + i + 99 + xoffset) = '1'; + } + } + } +} + +void draw_hexagon(char *pixelbuf, int image_width, int xposn, int yposn) +{ + /* Put a hexagon into the pixel buffer */ + int i, j; + + for(i = 0; i < 12; i++) { + for(j = 0; j < 10; j++) { + if(hexagon[(i * 10) + j] == 1) { + *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1'; + } + } + } +} + +void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int smalltext, int image_width, int image_height) +{ + /* Put a letter into a position */ + int skip, i, j, glyph_no, alphabet; + + skip = 0; + alphabet = 0; + + if(letter < 33) { skip = 1; } + if((letter > 127) && (letter < 161)) { skip = 1; } + + if(skip == 0) { + if(letter > 128) { + alphabet = 1; + glyph_no = letter - 161; + } else { + glyph_no = letter - 33; + } + + if(smalltext) { + for(i = 0; i <= 8; i++) { + for(j = 0; j < 5; j++) { + if(alphabet == 0) { + if(small_font[(glyph_no * 5) + (i * 475) + j - 1] == 1) { + *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; + } + } else { + if(small_font_extended[(glyph_no * 5) + (i * 475) + j - 1] == 1) { + *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; + } + } + } + } + } else { + for(i = 0; i <= 13; i++) { + for(j = 0; j < 7; j++) { + if(alphabet == 0) { + if(ascii_font[(glyph_no * 7) + (i * 665) + j - 1] == 1) { + *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; + } + } else { + if(ascii_ext_font[(glyph_no * 7) + (i * 665) + j - 1] == 1) { + *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; + } + } + } + } + } + } +} + +void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int smalltext, int image_width, int image_height) +{ + /* Plot a string into the pixel buffer */ + int i, string_length, string_left_hand; + + string_length = strlen(input_string); + string_left_hand = xposn - ((7 * string_length) / 2); + + for(i = 0; i < string_length; i++) { + draw_letter(pixbuf, input_string[i], string_left_hand + (i * 7), yposn, smalltext, image_width, image_height); + } + +} + +int maxi_png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type) +{ + int i, row, column, xposn, yposn; + int image_height, image_width; + char *pixelbuf; + int error_number; + int xoffset, yoffset; + + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + image_width = 300 + (2 * xoffset * 2); + image_height = 300 + (2 * yoffset * 2); + + if (!(pixelbuf = (char *) malloc(image_width * image_height))) { + printf("Insifficient memory for pixel buffer"); + return ERROR_ENCODING_PROBLEM; + } else { + for(i = 0; i < (image_width * image_height); i++) { + *(pixelbuf + i) = '0'; + } + } + + draw_bullseye(pixelbuf, image_width, (2 * xoffset), (2 * yoffset)); + + for(row = 0; row < symbol->rows; row++) { + yposn = row * 9; + for(column = 0; column < symbol->width; column++) { + xposn = column * 10; + if(module_is_set(symbol, row, column)) { + if(row & 1) { + /* Odd (reduced) row */ + xposn += 5; + draw_hexagon(pixelbuf, image_width, xposn + (2 * xoffset), yposn + (2 * yoffset)); + } else { + /* Even (full) row */ + draw_hexagon(pixelbuf, image_width, xposn + (2 * xoffset), yposn + (2 * yoffset)); + } + } + } + } + + if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + /* boundary bars */ + draw_bar(pixelbuf, 0, image_width, 0, symbol->border_width * 2, image_width, image_height); + draw_bar(pixelbuf, 0, image_width, 300 + (symbol->border_width * 2), symbol->border_width * 2, image_width, image_height); + } + + if((symbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + draw_bar(pixelbuf, 0, symbol->border_width * 2, 0, image_height, image_width, image_height); + draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * 2), symbol->border_width * 2, 0, image_height, image_width, image_height); + } + + error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type); + free(pixelbuf); + return error_number; +} + +void to_latin1(unsigned char source[], unsigned char preprocessed[]) +{ + int j, i, input_length; + + input_length = ustrlen(source); + + j = 0; + i = 0; + do { + if(source[i] < 128) { + preprocessed[j] = source[i]; + j++; + i++; + } else { + if(source[i] == 0xC2) { + preprocessed[j] = source[i + 1]; + j++; + i += 2; + } + if(source[i] == 0xC3) { + preprocessed[j] = source[i + 1] + 64; + j++; + i += 2; + } + } + } while (i < input_length); + preprocessed[j] = '\0'; + + return; +} + +int png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type) +{ + int textdone, main_width, comp_offset, large_bar_count; + char textpart[10], addon[6]; + float addon_text_posn, preset_height, large_bar_height; + int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height; + char *pixelbuf = NULL; + int addon_latch = 0, smalltext = 0; + int this_row, block_width, plot_height, plot_yposn, textpos; + float row_height, row_posn; + int error_number; + int default_text_posn; + int next_yposn; + int tlen = ustrlen(symbol->text); +#ifndef _MSC_VER + unsigned char local_text[tlen + 1]; +#else + unsigned char* local_text = (unsigned char*)_alloca(tlen+ 1); +#endif + + if(symbol->show_hrt != 0) { + to_latin1(symbol->text, local_text); + } else { + local_text[0] = '\0'; + } + + textdone = 0; + main_width = symbol->width; + strcpy(addon, ""); + comp_offset = 0; + addon_text_posn = 0.0; + row_height = 0; + if(symbol->output_options & SMALL_TEXT) { + smalltext = 1; + } + + if (symbol->height == 0) { + symbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for(i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if(symbol->row_height[i] == 0) { + large_bar_count++; + } + } + + if (large_bar_count == 0) { + symbol->height = preset_height; + large_bar_height = 10; + } else { + large_bar_height = (symbol->height - preset_height) / large_bar_count; + } + + while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch(tlen) { + case 13: /* EAN 13 */ + case 16: + case 19: + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 96 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 51 + comp_offset; + } + } + + latch = 0; + r = 0; + /* Isolate add-on text */ + if(is_extendable(symbol->symbology)) { + for(i = 0; i < tlen; i++) { + if (latch == 1) { + addon[r] = local_text[i]; + r++; + } + if (symbol->text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if(tlen) { + textoffset = 9; + } else { + textoffset = 0; + } + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + image_width = 2 * (symbol->width + xoffset + xoffset); + image_height = 2 * (symbol->height + textoffset + yoffset + yoffset); + + if (!(pixelbuf = (char *) malloc(image_width * image_height))) { + printf("Insufficient memory for pixel buffer"); + return ERROR_ENCODING_PROBLEM; + } else { + for(i = 0; i < (image_width * image_height); i++) { + *(pixelbuf + i) = '0'; + } + } + + if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + default_text_posn = image_height - 17; + } else { + default_text_posn = image_height - 17 - symbol->border_width - symbol->border_width; + } + + row_posn = textoffset + yoffset; + next_yposn = textoffset + yoffset; + row_height = 0; + + /* Plot the body of the symbol to the pixel buffer */ + for(r = 0; r < symbol->rows; r++) { + this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */ + row_posn += row_height; + plot_yposn = next_yposn; + if(symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + next_yposn = (int)(row_posn + row_height); + plot_height = next_yposn - plot_yposn; + + i = 0; + if(module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if((addon_latch == 0) && (r == 0) && (i > main_width)) { + plot_height = (int)(row_height - 5.0); + plot_yposn = (int)(row_posn - 5.0); + addon_text_posn = row_posn + row_height - 8.0; + addon_latch = 1; + } + if(latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset) * 2, block_width * 2, plot_yposn * 2, plot_height * 2, image_width, image_height); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + + xoffset += comp_offset; + + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions and text formatting for EAN8 and EAN13 */ + switch(tlen) { + case 8: /* EAN-8 */ + case 11: + case 14: + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + for(i = 0; i < 4; i++) { + textpart[i] = symbol->text[i]; + } + textpart[4] = '\0'; + textpos = 2 * (17 + xoffset); + + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + for(i = 0; i < 4; i++) { + textpart[i] = symbol->text[i + 4]; + } + textpart[4] = '\0'; + textpos = 2 * (50 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 86); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 100); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + } + + break; + case 13: /* EAN 13 */ + case 16: + case 19: + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = 2 * (-7 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 2 * (24 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 7]; + } + textpart[6] = '\0'; + textpos = 2 * (71 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 114); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 128); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + } + break; + + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions and text formatting for UPCA */ + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if(latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 11 + comp_offset); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if(latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = 2 * (-5 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + for(i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[5] = '\0'; + textpos = 2 * (27 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + for(i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 6]; + } + textpart[6] = '\0'; + textpos = 2 * (68 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + textpart[0] = symbol->text[11]; + textpart[1] = '\0'; + textpos = 2 * (100 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 116); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 130); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + } + + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions and text formatting for UPCE */ + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = 2 * (-5 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 2 * (24 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + textpart[0] = symbol->text[7]; + textpart[1] = '\0'; + textpos = 2 * (55 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 70); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 84); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); + break; + } + + } + + xoffset -= comp_offset; + + /* Put boundary bars or box around symbol */ + if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + /* boundary bars */ + draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height); + draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height); + if((symbol->output_options & BARCODE_BIND) != 0) { + if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + for(r = 1; r < symbol->rows; r++) { + draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height); + } + } + } + } + + if((symbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + draw_bar(pixelbuf, 0, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height); + draw_bar(pixelbuf, (symbol->width + xoffset + xoffset - symbol->border_width) * 2, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height); + } + + /* Put the human readable text at the bottom */ + if((textdone == 0) && tlen) { + textpos = (image_width / 2); + draw_string(pixelbuf, (char*)local_text, textpos, default_text_posn, smalltext, image_width, image_height); + } + + error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type); + free(pixelbuf); + return error_number; +} + +#ifndef NO_PNG +int png_handle(struct zint_symbol *symbol, int rotate_angle) +{ + int error; + + if(symbol->symbology == BARCODE_MAXICODE) { + error = maxi_png_plot(symbol, rotate_angle, PNG_DATA); + } else { + error = png_plot(symbol, rotate_angle, PNG_DATA); + } + + return error; +} +#endif /* NO_PNG */ + +int bmp_handle(struct zint_symbol *symbol, int rotate_angle) +{ + int error; + + if(symbol->symbology == BARCODE_MAXICODE) { + error = maxi_png_plot(symbol, rotate_angle, BMP_DATA); + } else { + error = png_plot(symbol, rotate_angle, BMP_DATA); + } + + return error; +} + diff --git a/backend/ps.c b/backend/ps.c new file mode 100644 index 0000000..ce7fca1 --- /dev/null +++ b/backend/ps.c @@ -0,0 +1,772 @@ +/* ps.c - Post Script output */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <locale.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include "common.h" + +#define SSET "0123456789ABCDEF" + +/* This file has expanded quite a bit since version 1.5 in order to accomodate + the formatting rules for EAN and UPC symbols as set out in EN 797:1995 - the + down side of this support is that the code is now vertually unreadable! */ + +int ps_plot(struct zint_symbol *symbol) +{ + int i, block_width, latch, r, this_row; + float textpos, large_bar_height, preset_height, row_height, row_posn; + FILE *feps; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper; + int error_number = 0; + int textoffset, xoffset, yoffset, textdone, main_width; + char textpart[10], addon[6]; + int large_bar_count, comp_offset; + float addon_text_posn; + float scaler = symbol->scale; + float default_text_posn; + int plot_text = 1; + const char *locale = NULL; + + row_height=0; + textdone = 0; + main_width = symbol->width; + strcpy(addon, ""); + comp_offset = 0; + addon_text_posn = 0.0; + + if((symbol->output_options & BARCODE_STDOUT) != 0) { + feps = stdout; + } else { + feps = fopen(symbol->outfile, "w"); + } + if(feps == NULL) { + strcpy(symbol->errtxt, "Could not open output file"); + return ERROR_FILE_ACCESS; + } + + /* sort out colour options */ + to_upper((unsigned char*)symbol->fgcolour); + to_upper((unsigned char*)symbol->bgcolour); + + if(strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "Malformed foreground colour target"); + return ERROR_INVALID_OPTION; + } + if(strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "Malformed background colour target"); + return ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); + if (error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Malformed foreground colour target"); + return ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour)); + if (error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Malformed background colour target"); + return ERROR_INVALID_OPTION; + } + locale = setlocale(LC_ALL, "C"); + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + red_ink = fgred / 256.0; + green_ink = fggrn / 256.0; + blue_ink = fgblu / 256.0; + red_paper = bgred / 256.0; + green_paper = bggrn / 256.0; + blue_paper = bgblu / 256.0; + + if (symbol->height == 0) { + symbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for(i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if(symbol->row_height[i] == 0) { + large_bar_count++; + } + } + large_bar_height = (symbol->height - preset_height) / large_bar_count; + + if (large_bar_count == 0) { + symbol->height = preset_height; + } + + while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch(ustrlen(symbol->text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 96 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 51 + comp_offset; + } + } + + latch = 0; + r = 0; + /* Isolate add-on text */ + if(is_extendable(symbol->symbology)) { + for(i = 0; i < ustrlen(symbol->text); i++) { + if (latch == 1) { + addon[r] = symbol->text[i]; + r++; + } + if (symbol->text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if((symbol->show_hrt == 0) || (ustrlen(symbol->text) == 0)) { + plot_text = 0; + } + if(plot_text) { + textoffset = 9; + } else { + textoffset = 0; + } + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + + /* Start writing the header */ + fprintf(feps, "%%!PS-Adobe-3.0 EPSF-3.0\n"); + fprintf(feps, "%%%%Creator: Zint %s\n", ZINT_VERSION); + if(ustrlen(symbol->text) != 0) { + fprintf(feps, "%%%%Title: %s\n",symbol->text); + } else { + fprintf(feps, "%%%%Title: Zint Generated Symbol\n"); + } + fprintf(feps, "%%%%Pages: 0\n"); + if(symbol->symbology != BARCODE_MAXICODE) { + fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", roundup((symbol->width + xoffset + xoffset) * scaler), roundup((symbol->height + textoffset + yoffset + yoffset) * scaler)); + } else { + fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", roundup((74.0 + xoffset + xoffset) * scaler), roundup((72.0 + yoffset + yoffset) * scaler)); + } + fprintf(feps, "%%%%EndComments\n"); + + /* Definitions */ + fprintf(feps, "/TL { setlinewidth moveto lineto stroke } bind def\n"); + fprintf(feps, "/TC { moveto 0 360 arc 360 0 arcn fill } bind def\n"); + fprintf(feps, "/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def\n"); + fprintf(feps, "/TB { 2 copy } bind def\n"); + fprintf(feps, "/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def\n"); + fprintf(feps, "/TE { pop pop } bind def\n"); + + fprintf(feps, "newpath\n"); + + /* Now the actual representation */ + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_paper, green_paper, blue_paper); + fprintf(feps, "%.2f 0.00 TB 0.00 %.2f TR\n", (symbol->height + textoffset + yoffset + yoffset) * scaler, (symbol->width + xoffset + xoffset) * scaler); + + if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + default_text_posn = 0.5 * scaler; + } else { + default_text_posn = (symbol->border_width + 0.5) * scaler; + } + + if(symbol->symbology == BARCODE_MAXICODE) { + /* Maxicode uses hexagons */ + float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; + + + textoffset = 0.0; + if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + 72.0 + symbol->border_width) * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler); + } + if((symbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, (74.0 + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler); + } + + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, (44.73 + xoffset) * scaler, (35.60 + yoffset) * scaler); + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, (40.98 + xoffset) * scaler, (35.60 + yoffset) * scaler); + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, (37.19 + xoffset) * scaler, (35.60 + yoffset) * scaler); + for(r = 0; r < symbol->rows; r++) { + for(i = 0; i < symbol->width; i++) { + if(module_is_set(symbol, r, i)) { + /* Dump a hexagon */ + my = ((symbol->rows - r - 1)) * 2.135 + 1.43; + ay = my + 1.0 + yoffset; + by = my + 0.5 + yoffset; + cy = my - 0.5 + yoffset; + dy = my - 1.0 + yoffset; + ey = my - 0.5 + yoffset; + fy = my + 0.5 + yoffset; + + mx = 2.46 * i + 1.23 + (r & 1 ? 1.23 : 0); + + ax = mx + xoffset; + bx = mx + 0.86 + xoffset; + cx = mx + 0.86 + xoffset; + dx = mx + xoffset; + ex = mx - 0.86 + xoffset; + fx = mx - 0.86 + xoffset; + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler); + } + } + } + } + + if(symbol->symbology != BARCODE_MAXICODE) { + /* everything else uses rectangles (or squares) */ + /* Works from the bottom of the symbol up */ + int addon_latch = 0; + + for(r = 0; r < symbol->rows; r++) { + this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */ + if(symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + row_posn = 0; + for(i = 0; i < r; i++) { + if(symbol->row_height[symbol->rows - i - 1] == 0) { + row_posn += large_bar_height; + } else { + row_posn += symbol->row_height[symbol->rows - i - 1]; + } + } + row_posn += (textoffset + yoffset); + + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f ", row_height * scaler, row_posn * scaler); + i = 0; + if(module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if((addon_latch == 0) && (r == 0) && (i > main_width)) { + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f ", (row_height - 5.0) * scaler, (row_posn - 5.0) * scaler); + addon_text_posn = row_posn + row_height - 8.0; + addon_latch = 1; + } + if(latch == 1) { + /* a bar */ + fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset) * scaler, block_width * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + } + /* That's done the actual data area, everything else is human-friendly */ + + xoffset += comp_offset; + + if (plot_text) { + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || + (symbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions and text formatting for EAN8 and EAN13 */ + switch(ustrlen(symbol->text)) { + case 8: /* EAN-8 */ + case 11: + case 14: + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (32 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (34 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (64 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (66 + xoffset) * scaler, 1 * scaler); + for(i = 0; i < 4; i++) { + textpart[i] = symbol->text[i]; + } + textpart[4] = '\0'; + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 17; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for(i = 0; i < 4; i++) { + textpart[i] = symbol->text[i + 4]; + } + textpart[4] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 50; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch(strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 86; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 100; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + + break; + case 13: /* EAN 13 */ + case 16: + case 19: + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (92 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (94 + xoffset) * scaler, 1 * scaler); + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = -7; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 24; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 7]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 71; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch(strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 114; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 128; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + break; + + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions and text formatting for UPCA */ + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if(latch == 1) { + /* a bar */ + fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 11 + comp_offset); + fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if(latch == 1) { + /* a bar */ + fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = -5; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for(i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[5] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 27; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for(i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 6]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 68; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textpart[0] = symbol->text[11]; + textpart[1] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = 100; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch(strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 116; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 130; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions and text formatting for UPCE */ + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (50 + xoffset) * scaler, 1 * scaler); + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = -5; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 24; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textpart[0] = symbol->text[7]; + textpart[1] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = 55; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch(strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 70; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 84; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + + } + } /* if (plot_text) */ + + xoffset -= comp_offset; + + switch(symbol->symbology) { + case BARCODE_MAXICODE: + /* Do nothing! (It's already been done) */ + break; + default: + if((symbol->output_options & BARCODE_BIND) != 0) { + if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + for(r = 1; r < symbol->rows; r++) { + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, xoffset * scaler, symbol->width * scaler); + } + } + } + if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler); + } + if((symbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler); + } + break; + } + + /* Put the human readable text at the bottom */ + if(plot_text && (textdone == 0)) { + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = symbol->width / 2.0; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", symbol->text); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", symbol->text); + fprintf(feps, "setmatrix\n"); + } + fprintf(feps, "\nshowpage\n"); + if((symbol->output_options & BARCODE_STDOUT) == 0) + fclose(feps); + + if (locale) + setlocale(LC_ALL, locale); + + return error_number; +} + diff --git a/backend/qr.c b/backend/qr.c new file mode 100644 index 0000000..6af0755 --- /dev/null +++ b/backend/qr.c @@ -0,0 +1,2361 @@ +/* qr.c Handles QR Code */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <string.h> +#ifdef _MSC_VER +#include <malloc.h> +#endif +#include "common.h" +#include <stdio.h> +#include "sjis.h" +#include "qr.h" +#include "reedsol.h" + +int in_alpha(int glyph) { + /* Returns true if input glyph is in the Alphanumeric set */ + int retval = 0; + char cglyph = (char) glyph; + + if((cglyph >= '0') && (cglyph <= '9')) { + retval = 1; + } + if((cglyph >= 'A') && (cglyph <= 'Z')) { + retval = 1; + } + switch (cglyph) { + case ' ': + case '$': + case '%': + case '*': + case '+': + case '-': + case '.': + case '/': + case ':': + retval = 1; + break; + } + + return retval; +} + +void define_mode(char mode[], int jisdata[], int length, int gs1) +{ + /* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */ + int i, mlen, j; + + for(i = 0; i < length; i++) { + if(jisdata[i] > 0xff) { + mode[i] = 'K'; + } else { + mode[i] = 'B'; + if(in_alpha(jisdata[i])) { mode[i] = 'A'; } + if(gs1 && (jisdata[i] == '[')) { mode[i] = 'A'; } + if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { mode[i] = 'N'; } + } + } + + /* If less than 6 numeric digits together then don't use numeric mode */ + for(i = 0; i < length; i++) { + if(mode[i] == 'N') { + if(((i != 0) && (mode[i - 1] != 'N')) || (i == 0)) { + mlen = 0; + while (((mlen + i) < length) && (mode[mlen + i] == 'N')) { + mlen++; + }; + if(mlen < 6) { + for(j = 0; j < mlen; j++) { + mode[i + j] = 'A'; + } + } + } + } + } + + /* If less than 4 alphanumeric characters together then don't use alphanumeric mode */ + for(i = 0; i < length; i++) { + if(mode[i] == 'A') { + if(((i != 0) && (mode[i - 1] != 'A')) || (i == 0)) { + mlen = 0; + while (((mlen + i) < length) && (mode[mlen + i] == 'A')) { + mlen++; + }; + if(mlen < 6) { + for(j = 0; j < mlen; j++) { + mode[i + j] = 'B'; + } + } + } + } + } +} + +int estimate_binary_length(char mode[], int length, int gs1) +{ + /* Make an estimate (worst case scenario) of how long the binary string will be */ + int i, count = 0; + char current = 0; + int a_count = 0; + int n_count = 0; + + if(gs1) { count += 4; } + + for(i = 0; i < length; i++) { + if(mode[i] != current) { + switch(mode[i]) { + case 'K': count += 12 + 4; current = 'K'; break; + case 'B': count += 16 + 4; current = 'B'; break; + case 'A': count += 13 + 4; current = 'A'; a_count = 0; break; + case 'N': count += 14 + 4; current = 'N'; n_count = 0; break; + } + } + + switch(mode[i]) { + case 'K': count += 13; break; + case 'B': count += 8; break; + case 'A': + a_count++; + if((a_count & 1) == 0) { + count += 5; // 11 in total + a_count = 0; + } + else + count += 6; + break; + case 'N': + n_count++; + if((n_count % 3) == 0) { + count += 3; // 10 in total + n_count = 0; + } + else if ((n_count & 1) == 0) + count += 3; // 7 in total + else + count += 4; + break; + } + } + + return count; +} + +static inline void qr_bscan(char *binary, int data, int h) +{ + for (; h; h>>=1) { + concat(binary, data & h ? "1" : "0"); + } +} + +void qr_binary(int datastream[], int version, int target_binlen, char mode[], int jisdata[], int length, int gs1, int est_binlen) +{ + /* Convert input data to a binary stream and add padding */ + int position = 0, debug = 0; + int short_data_block_length, i, scheme = 1; + char data_block, padbits; + int current_binlen, current_bytes; + int toggle, percent; + +#ifndef _MSC_VER + char binary[est_binlen + 12]; +#else + char* binary = (char *)_alloca(est_binlen + 12); +#endif + strcpy(binary, ""); + + if(gs1) { + concat(binary, "0101"); /* FNC1 */ + } + + if(version <= 9) { + scheme = 1; + } else if((version >= 10) && (version <= 26)) { + scheme = 2; + } else if(version >= 27) { + scheme = 3; + } + + if(debug) { + for(i = 0; i < length; i++) { + printf("%c", mode[i]); + } + printf("\n"); + } + + percent = 0; + + do { + data_block = mode[position]; + short_data_block_length = 0; + do { + short_data_block_length++; + } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block)); + + switch(data_block) { + case 'K': + /* Kanji mode */ + /* Mode indicator */ + concat(binary, "1000"); + + /* Character count indicator */ + qr_bscan(binary, short_data_block_length, 0x20 << (scheme*2)); /* scheme = 1..3 */ + + if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + for(i = 0; i < short_data_block_length; i++) { + int jis = jisdata[position + i]; + int msb, lsb, prod; + + if(jis > 0x9fff) { jis -= 0xc140; } + msb = (jis & 0xff00) >> 4; + lsb = (jis & 0xff); + prod = (msb * 0xc0) + lsb; + + qr_bscan(binary, prod, 0x1000); + + if(debug) { printf("0x%4X ", prod); } + } + + if(debug) { printf("\n"); } + + break; + case 'B': + /* Byte mode */ + /* Mode indicator */ + concat(binary, "0100"); + + /* Character count indicator */ + qr_bscan(binary, short_data_block_length, scheme > 1 ? 0x8000 : 0x80); /* scheme = 1..3 */ + + if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + for(i = 0; i < short_data_block_length; i++) { + int byte = jisdata[position + i]; + + if(gs1 && (byte == '[')) { + byte = 0x1d; /* FNC1 */ + } + + qr_bscan(binary, byte, 0x80); + + if(debug) { printf("0x%2X(%d) ", byte, byte); } + } + + if(debug) { printf("\n"); } + + break; + case 'A': + /* Alphanumeric mode */ + /* Mode indicator */ + concat(binary, "0010"); + + /* Character count indicator */ + qr_bscan(binary, short_data_block_length, 0x40 << (2 * scheme)); /* scheme = 1..3 */ + + if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + i = 0; + while ( i < short_data_block_length ) { + int count; + int first = 0, second = 0, prod; + + if(percent == 0) { + if(gs1 && (jisdata[position + i] == '%')) { + first = posn(RHODIUM, '%'); + second = posn(RHODIUM, '%'); + count = 2; + prod = (first * 45) + second; + i++; + } else { + if(gs1 && (jisdata[position + i] == '[')) { + first = posn(RHODIUM, '%'); /* FNC1 */ + } else { + first = posn(RHODIUM, (char) jisdata[position + i]); + } + count = 1; + i++; + prod = first; + + if(mode[position + i] == 'A') { + if(gs1 && (jisdata[position + i] == '%')) { + second = posn(RHODIUM, '%'); + count = 2; + prod = (first * 45) + second; + percent = 1; + } else { + if(gs1 && (jisdata[position + i] == '[')) { + second = posn(RHODIUM, '%'); /* FNC1 */ + } else { + second = posn(RHODIUM, (char) jisdata[position + i]); + } + count = 2; + i++; + prod = (first * 45) + second; + } + } + } + } else { + first = posn(RHODIUM, '%'); + count = 1; + i++; + prod = first; + percent = 0; + + if(mode[position + i] == 'A') { + if(gs1 && (jisdata[position + i] == '%')) { + second = posn(RHODIUM, '%'); + count = 2; + prod = (first * 45) + second; + percent = 1; + } else { + if(gs1 && (jisdata[position + i] == '[')) { + second = posn(RHODIUM, '%'); /* FNC1 */ + } else { + second = posn(RHODIUM, (char) jisdata[position + i]); + } + count = 2; + i++; + prod = (first * 45) + second; + } + } + } + + qr_bscan(binary, prod, count == 2 ? 0x400 : 0x20); /* count = 1..2 */ + + if(debug) { printf("0x%4X ", prod); } + }; + + if(debug) { printf("\n"); } + + break; + case 'N': + /* Numeric mode */ + /* Mode indicator */ + concat(binary, "0001"); + + /* Character count indicator */ + qr_bscan(binary, short_data_block_length, 0x80 << (2 * scheme)); /* scheme = 1..3 */ + + if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + i = 0; + while ( i < short_data_block_length ) { + int count; + int first = 0, second = 0, third = 0, prod; + + first = posn(NEON, (char) jisdata[position + i]); + count = 1; + prod = first; + + if(mode[position + i + 1] == 'N') { + second = posn(NEON, (char) jisdata[position + i + 1]); + count = 2; + prod = (prod * 10) + second; + + if(mode[position + i + 2] == 'N') { + third = posn(NEON, (char) jisdata[position + i + 2]); + count = 3; + prod = (prod * 10) + third; + } + } + + qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */ + + if(debug) { printf("0x%4X (%d)", prod, prod); } + + i += count; + }; + + if(debug) { printf("\n"); } + + break; + } + + position += short_data_block_length; + } while (position < length) ; + + /* Terminator */ + concat(binary, "0000"); + + current_binlen = strlen(binary); + padbits = 8 - (current_binlen % 8); + if(padbits == 8) { padbits = 0; } + current_bytes = (current_binlen + padbits) / 8; + + /* Padding bits */ + for(i = 0; i < padbits; i++) { + concat(binary, "0"); + } + + /* Put data into 8-bit codewords */ + for(i = 0; i < current_bytes; i++) { + datastream[i] = 0x00; + if(binary[i * 8] == '1') { datastream[i] += 0x80; } + if(binary[i * 8 + 1] == '1') { datastream[i] += 0x40; } + if(binary[i * 8 + 2] == '1') { datastream[i] += 0x20; } + if(binary[i * 8 + 3] == '1') { datastream[i] += 0x10; } + if(binary[i * 8 + 4] == '1') { datastream[i] += 0x08; } + if(binary[i * 8 + 5] == '1') { datastream[i] += 0x04; } + if(binary[i * 8 + 6] == '1') { datastream[i] += 0x02; } + if(binary[i * 8 + 7] == '1') { datastream[i] += 0x01; } + } + + /* Add pad codewords */ + toggle = 0; + for(i = current_bytes; i < target_binlen; i++) { + if(toggle == 0) { + datastream[i] = 0xec; + toggle = 1; + } else { + datastream[i] = 0x11; + toggle = 0; + } + } + + if(debug) { + printf("Resulting codewords:\n\t"); + for(i = 0; i < target_binlen; i++) { + printf("0x%2X ", datastream[i]); + } + printf("\n"); + } +} + +void add_ecc(int fullstream[], int datastream[], int version, int data_cw, int blocks) +{ + /* Split data into blocks, add error correction and then interleave the blocks and error correction data */ + int ecc_cw = qr_total_codewords[version - 1] - data_cw; + int short_data_block_length = data_cw / blocks; + int qty_long_blocks = data_cw % blocks; + int qty_short_blocks = blocks - qty_long_blocks; + int ecc_block_length = ecc_cw / blocks; + int i, j, length_this_block, posn, debug = 0; + + +#ifndef _MSC_VER + unsigned char data_block[short_data_block_length + 2]; + unsigned char ecc_block[ecc_block_length + 2]; + int interleaved_data[data_cw + 2]; + int interleaved_ecc[ecc_cw + 2]; +#else + unsigned char* data_block = (unsigned char *)_alloca(short_data_block_length + 2); + unsigned char* ecc_block = (unsigned char *)_alloca(ecc_block_length + 2); + int* interleaved_data = (int *)_alloca((data_cw + 2) * sizeof(int)); + int* interleaved_ecc = (int *)_alloca((ecc_cw + 2) * sizeof(int)); +#endif + + posn = 0; + + for(i = 0; i < blocks; i++) { + if(i < qty_short_blocks) { length_this_block = short_data_block_length; } else { length_this_block = short_data_block_length + 1; } + + for(j = 0; j < ecc_block_length; j++) { + ecc_block[j] = 0; + } + + for(j = 0; j < length_this_block; j++) { + data_block[j] = (unsigned char) datastream[posn + j]; + } + + rs_init_gf(0x11d); + rs_init_code(ecc_block_length, 0); + rs_encode(length_this_block, data_block, ecc_block); + rs_free(); + + if(debug) { + printf("Block %d: ", i + 1); + for(j = 0; j < length_this_block; j++) { + printf("%2X ", data_block[j]); + } + if(i < qty_short_blocks) { + printf(" "); + } + printf(" // "); + for(j = 0; j < ecc_block_length; j++) { + printf("%2X ", ecc_block[ecc_block_length - j - 1]); + } + printf("\n"); + } + + for(j = 0; j < short_data_block_length; j++) { + interleaved_data[(j * blocks) + i] = (int) data_block[j]; + } + + if(i >= qty_short_blocks){ + interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length]; + } + + for(j = 0; j < ecc_block_length; j++) { + interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1]; + } + + posn += length_this_block; + } + + for(j = 0; j < data_cw; j++) { + fullstream[j] = interleaved_data[j]; + } + for(j = 0; j < ecc_cw; j++) { + fullstream[j + data_cw] = interleaved_ecc[j]; + } + + if(debug) { + printf("\nData Stream: \n"); + for(j = 0; j < (data_cw + ecc_cw); j++) { + printf("%2X ", fullstream[j]); + } + printf("\n"); + } +} + +void place_finder(unsigned char grid[], int size, int x, int y) +{ + int xp, yp; + + int finder[] = { + 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1 + }; + + for(xp = 0; xp < 7; xp++) { + for(yp = 0; yp < 7; yp++) { + if (finder[xp + (7 * yp)] == 1) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +void place_align(unsigned char grid[], int size, int x, int y) +{ + int xp, yp; + + int alignment[] = { + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 1, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1 + }; + + x -= 2; + y -= 2; /* Input values represent centre of pattern */ + + for(xp = 0; xp < 5; xp++) { + for(yp = 0; yp < 5; yp++) { + if (alignment[xp + (5 * yp)] == 1) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +void setup_grid(unsigned char* grid, int size, int version) +{ + int i, toggle = 1; + int loopsize, x, y, xcoord, ycoord; + + /* Add timing patterns */ + for(i = 0; i < size; i++) { + if(toggle == 1) { + grid[(6 * size) + i] = 0x21; + grid[(i * size) + 6] = 0x21; + toggle = 0; + } else { + grid[(6 * size) + i] = 0x20; + grid[(i * size) + 6] = 0x20; + toggle = 1; + } + } + + /* Add finder patterns */ + place_finder(grid, size, 0, 0); + place_finder(grid, size, 0, size - 7); + place_finder(grid, size, size - 7, 0); + + /* Add separators */ + for(i = 0; i < 7; i++) { + grid[(7 * size) + i] = 0x10; + grid[(i * size) + 7] = 0x10; + grid[(7 * size) + (size - 1 - i)] = 0x10; + grid[(i * size) + (size - 8)] = 0x10; + grid[((size - 8) * size) + i] = 0x10; + grid[((size - 1 - i) * size) + 7] = 0x10; + } + grid[(7 * size) + 7] = 0x10; + grid[(7 * size) + (size - 8)] = 0x10; + grid[((size - 8) * size) + 7] = 0x10; + + /* Add alignment patterns */ + if(version != 1) { + /* Version 1 does not have alignment patterns */ + + loopsize = qr_align_loopsize[version - 1]; + for(x = 0; x < loopsize; x++) { + for(y = 0; y < loopsize; y++) { + xcoord = qr_table_e1[((version - 2) * 7) + x]; + ycoord = qr_table_e1[((version - 2) * 7) + y]; + + if(!(grid[(ycoord * size) + xcoord] & 0x10)) { + place_align(grid, size, xcoord, ycoord); + } + } + } + } + + /* Reserve space for format information */ + for(i = 0; i < 8; i++) { + grid[(8 * size) + i] += 0x20; + grid[(i * size) + 8] += 0x20; + grid[(8 * size) + (size - 1 - i)] = 0x20; + grid[((size - 1 - i) * size) + 8] = 0x20; + } + grid[(8 * size) + 8] += 20; + grid[((size - 1 - 7) * size) + 8] = 0x21; /* Dark Module from Figure 25 */ + + /* Reserve space for version information */ + if(version >= 7) { + for(i = 0; i < 6; i++) { + grid[((size - 9) * size) + i] = 0x20; + grid[((size - 10) * size) + i] = 0x20; + grid[((size - 11) * size) + i] = 0x20; + grid[(i * size) + (size - 9)] = 0x20; + grid[(i * size) + (size - 10)] = 0x20; + grid[(i * size) + (size - 11)] = 0x20; + } + } +} + +int cwbit(int* datastream, int i) { + int word = i / 8; + int bit = i % 8; + int resultant = 0; + + switch(bit) { + case 0: if(datastream[word] & 0x80) { resultant = 1; } else { resultant = 0; } break; + case 1: if(datastream[word] & 0x40) { resultant = 1; } else { resultant = 0; } break; + case 2: if(datastream[word] & 0x20) { resultant = 1; } else { resultant = 0; } break; + case 3: if(datastream[word] & 0x10) { resultant = 1; } else { resultant = 0; } break; + case 4: if(datastream[word] & 0x08) { resultant = 1; } else { resultant = 0; } break; + case 5: if(datastream[word] & 0x04) { resultant = 1; } else { resultant = 0; } break; + case 6: if(datastream[word] & 0x02) { resultant = 1; } else { resultant = 0; } break; + case 7: if(datastream[word] & 0x01) { resultant = 1; } else { resultant = 0; } break; + } + + return resultant; +} + +void populate_grid(unsigned char* grid, int size, int* datastream, int cw) +{ + int direction = 1; /* up */ + int row = 0; /* right hand side */ + + int i, n, x, y; + + n = cw * 8; + y = size - 1; + i = 0; + do { + x = (size - 2) - (row * 2); + if(x < 6) + x--; /* skip over vertical timing pattern */ + + if(!(grid[(y * size) + (x + 1)] & 0xf0)) { + if (cwbit(datastream, i)) { + grid[(y * size) + (x + 1)] = 0x01; + } else { + grid[(y * size) + (x + 1)] = 0x00; + } + i++; + } + + if(i < n) { + if(!(grid[(y * size) + x] & 0xf0)) { + if (cwbit(datastream, i)) { + grid[(y * size) + x] = 0x01; + } else { + grid[(y * size) + x] = 0x00; + } + i++; + } + } + + if(direction) { y--; } else { y++; } + if(y == -1) { + /* reached the top */ + row++; + y = 0; + direction = 0; + } + if(y == size) { + /* reached the bottom */ + row++; + y = size - 1; + direction = 1; + } + } while (i < n); +} + +int evaluate(unsigned char *grid, int size, int pattern) +{ + int x, y, block; + int result = 0; + char state; + int p; + int dark_mods; + int percentage, k, k2; + +#ifndef _MSC_VER + char local[size * size]; +#else + char* local = (char *)_alloca((size * size) * sizeof(char)); +#endif + + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + switch(pattern) { + case 0: if (grid[(y * size) + x] & 0x01) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 1: if (grid[(y * size) + x] & 0x02) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 2: if (grid[(y * size) + x] & 0x04) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 3: if (grid[(y * size) + x] & 0x08) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 4: if (grid[(y * size) + x] & 0x10) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 5: if (grid[(y * size) + x] & 0x20) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 6: if (grid[(y * size) + x] & 0x40) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + case 7: if (grid[(y * size) + x] & 0x80) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; + } + } + } + + /* Test 1: Adjacent modules in row/column in same colour */ + /* Vertical */ + for(x = 0; x < size; x++) { + state = local[x]; + block = 0; + for(y = 0; y < size; y++) { + if(local[(y * size) + x] == state) { + block++; + if(block ==5) + result += 3; + + if(block>5) + result +=1; + } else { + block=0; + } + } + } + + /* Horizontal */ + for(y = 0; y < size; y++) { + state = local[y * size]; + block = 0; + for(x = 0; x < size; x++) { + if(local[(y * size) + x] == state) { + block++; + if(block ==5) + result += 3; + + if(block>5) + result +=1; + } else { + block=0; + } + } + } + + /* Test 2 fd02131114 */ + for(x = 0; x < size-1; x++) { + for(y = 0; y < (size - 7) -1; y++) { + // y + 1??? + if((local[((y + 1) * size) + x] == '1') && + (local[((y + 1) * size) + x+1] == '1') && + (local[(((y + 1)+1) * size) + x] == '1') && + (local[(((y + 1)+1) * size) + x+1] == '1') + ) { result += 3; } + + if((local[((y + 1) * size) + x] == '0') && + (local[((y + 1) * size) + x+1] == '0') && + (local[(((y + 1)+1) * size) + x] == '0') && + (local[(((y + 1)+1) * size) + x+1] == '0') + ) { result += 3; } + } + } + + /* Test 3: fd02131114 */ + /*pattern 10111010000 */ + /* Vertical */ + for(x = 0; x < size; x++) { + for(y = 0; y < (size - 11); y++) { + p = 0; + if(local[(y * size) + x] == '1') { p += 1; } + if(local[((y + 1) * size) + x] == '0') { p += 1; } + if(local[((y + 2) * size) + x] == '1') { p += 1; } + if(local[((y + 3) * size) + x] == '1') { p += 1; } + if(local[((y + 4) * size) + x] == '1') { p += 1; } + if(local[((y + 5) * size) + x] == '0') { p += 1; } + if(local[((y + 6) * size) + x] == '1') { p += 1; } + if(local[((y + 7) * size) + x] == '0') { p += 1; } + if(local[((y + 8) * size) + x] == '0') { p += 1; } + if(local[((y + 9) * size) + x] == '0') { p += 1; } + if(local[((y + 10) * size) + x] == '0') { p += 1; } + if(p == 11) { + result += 40; + } + } + } + + /* Horizontal */ + for(y = 0; y < size; y++) { + for(x = 0; x < (size - 11); x++) { + p = 0; + if(local[(y * size) + x] == '1') { p += 1; } + if(local[(y * size) + x + 1] == '0') { p += 1; } + if(local[(y * size) + x + 2] == '1') { p += 1; } + if(local[(y * size) + x + 3] == '1') { p += 1; } + if(local[(y * size) + x + 4] == '1') { p += 1; } + if(local[(y * size) + x + 5] == '0') { p += 1; } + if(local[(y * size) + x + 6] == '1') { p += 1; } + if(local[(y * size) + x + 7] == '0') { p += 1; } + if(local[(y * size) + x + 8] == '0') { p += 1; } + if(local[(y * size) + x + 9] == '0') { p += 1; } + if(local[(y * size) + x + 10] == '0') { p += 1; } + if(p == 11) { + result += 40; + } + } + } + + /*pattern 00001011101 */ + /* Vertical */ + for(x = 0; x < size; x++) { + for(y = 0; y < (size - 11); y++) { + p = 0; + if(local[(y * size) + x] == '0') { p += 1; } + if(local[((y + 1) * size) + x] == '0') { p += 1; } + if(local[((y + 2) * size) + x] == '0') { p += 1; } + if(local[((y + 3) * size) + x] == '0') { p += 1; } + if(local[((y + 4) * size) + x] == '1') { p += 1; } + if(local[((y + 5) * size) + x] == '0') { p += 1; } + if(local[((y + 6) * size) + x] == '1') { p += 1; } + if(local[((y + 7) * size) + x] == '1') { p += 1; } + if(local[((y + 8) * size) + x] == '1') { p += 1; } + if(local[((y + 9) * size) + x] == '0') { p += 1; } + if(local[((y + 10) * size) + x] == '1') { p += 1; } + if(p == 11) { + result += 40; + } + } + } + + /* Horizontal */ + for(y = 0; y < size; y++) { + for(x = 0; x < (size - 11); x++) { + p = 0; + if(local[(y * size) + x] == '0') { p += 1; } + if(local[(y * size) + x + 1] == '0') { p += 1; } + if(local[(y * size) + x + 2] == '0') { p += 1; } + if(local[(y * size) + x + 3] == '0') { p += 1; } + if(local[(y * size) + x + 4] == '1') { p += 1; } + if(local[(y * size) + x + 5] == '0') { p += 1; } + if(local[(y * size) + x + 6] == '1') { p += 1; } + if(local[(y * size) + x + 7] == '1') { p += 1; } + if(local[(y * size) + x + 8] == '1') { p += 1; } + if(local[(y * size) + x + 9] == '0') { p += 1; } + if(local[(y * size) + x + 10] == '1') { p += 1; } + if(p == 11) { + result += 40; + } + } + } + + /* Test 4: Proportion of dark modules in entire symbol */ + dark_mods = 0; + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + if(local[(y * size) + x] == '1') { + dark_mods++; + } + } + } + percentage = 100 * (dark_mods / (size * size)); + int m=0; + for(x = 0; x < 100; x+=5) { + if(x<percentage) + m=x; + } + + k=abs((m-50)/5); + k2=abs((m+5-50)/5); + + int smallest=k; + if(k2<smallest) + smallest=k2; + + result += 10 * smallest; + + return result; +} + +void add_format_info_eval(unsigned char *eval, int size, int ecc_level, int pattern) +{ + /* Add format information to grid */ + + int format = pattern; + unsigned int seq; + int i; + + switch(ecc_level) { + case LEVEL_L: format += 0x08; break; + case LEVEL_Q: format += 0x18; break; + case LEVEL_H: format += 0x10; break; + } + + seq = qr_annex_c[format]; + + for(i = 0; i < 6; i++) { + eval[(i * size) + 8] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + for(i = 0; i < 8; i++) { + eval[(8 * size) + (size - i - 1)] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + for(i = 0; i < 6; i++) { + eval[(8 * size) + (5 - i)] = (seq >> (i + 9)) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + for(i = 0; i < 7; i++) { + eval[(((size - 7) + i) * size) + 8] = (seq >> (i + 8)) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + eval[(7 * size) + 8] = (seq >> 6) & 0x01 ? (0x01 >> pattern) : 0x00; + eval[(8 * size) + 8] = (seq >> 7) & 0x01 ? (0x01 >> pattern) : 0x00; + eval[(8 * size) + 7] = (seq >> 8) & 0x01 ? (0x01 >> pattern) : 0x00; +} + +int apply_bitmask(unsigned char *grid, int size, int ecc_level) +{ + int x, y; + unsigned char p; + int pattern, penalty[8]; + int best_val, best_pattern; + int bit; + +#ifndef _MSC_VER + unsigned char mask[size * size]; + unsigned char eval[size * size]; +#else + unsigned char* mask = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); + unsigned char* eval = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); +#endif + + /* Perform data masking */ + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + mask[(y * size) + x] = 0x00; + + // all eight bitmask variants are encoded in the 8 bits of the bytes that make up the mask array. + if (!(grid[(y * size) + x] & 0xf0)) { // exclude areas not to be masked. + if(((y + x) & 1) == 0) { mask[(y * size) + x] += 0x01; } + if((y & 1) == 0) { mask[(y * size) + x] += 0x02; } + if((x % 3) == 0) { mask[(y * size) + x] += 0x04; } + if(((y + x) % 3) == 0) { mask[(y * size) + x] += 0x08; } + if((((y / 2) + (x / 3)) & 1) == 0) { mask[(y * size) + x] += 0x10; } + if((((y * x) & 1) + ((y * x) % 3)) == 0) { mask[(y * size) + x] += 0x20; } + if(((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { mask[(y * size) + x] += 0x40; } + if(((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { mask[(y * size) + x] += 0x80; } + } + } + } + + // apply data masks to grid, result in eval + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; } + + eval[(y * size) + x] = mask[(y * size) + x] ^ p; + } + } + + /* Evaluate result */ + for(pattern = 0; pattern < 8; pattern++) { + add_format_info_eval(eval, size, ecc_level, pattern); + + penalty[pattern] = evaluate(eval, size, pattern); + } + + best_pattern = 0; + best_val = penalty[0]; + for(pattern = 1; pattern < 8; pattern++) { + if(penalty[pattern] < best_val) { + best_pattern = pattern; + best_val = penalty[pattern]; + } + } + + /* Apply mask */ + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + bit = 0; + switch(best_pattern) { + case 0: if(mask[(y * size) + x] & 0x01) { bit = 1; } break; + case 1: if(mask[(y * size) + x] & 0x02) { bit = 1; } break; + case 2: if(mask[(y * size) + x] & 0x04) { bit = 1; } break; + case 3: if(mask[(y * size) + x] & 0x08) { bit = 1; } break; + case 4: if(mask[(y * size) + x] & 0x10) { bit = 1; } break; + case 5: if(mask[(y * size) + x] & 0x20) { bit = 1; } break; + case 6: if(mask[(y * size) + x] & 0x40) { bit = 1; } break; + case 7: if(mask[(y * size) + x] & 0x80) { bit = 1; } break; + } + if(bit == 1) { + if(grid[(y * size) + x] & 0x01) { + grid[(y * size) + x] = 0x00; + } else { + grid[(y * size) + x] = 0x01; + } + } + } + } + + return best_pattern; +} + +void add_format_info(unsigned char *grid, int size, int ecc_level, int pattern) +{ + /* Add format information to grid */ + + int format = pattern; + unsigned int seq; + int i; + + switch(ecc_level) { + case LEVEL_L: format += 0x08; break; + case LEVEL_Q: format += 0x18; break; + case LEVEL_H: format += 0x10; break; + } + + seq = qr_annex_c[format]; + + for(i = 0; i < 6; i++) { + grid[(i * size) + 8] += (seq >> i) & 0x01; + } + + for(i = 0; i < 8; i++) { + grid[(8 * size) + (size - i - 1)] += (seq >> i) & 0x01; + } + + for(i = 0; i < 6; i++) { + grid[(8 * size) + (5 - i)] += (seq >> (i + 9)) & 0x01; + } + + for(i = 0; i < 7; i++) { + grid[(((size - 7) + i) * size) + 8] += (seq >> (i + 8)) & 0x01; + } + + grid[(7 * size) + 8] += (seq >> 6) & 0x01; + grid[(8 * size) + 8] += (seq >> 7) & 0x01; + grid[(8 * size) + 7] += (seq >> 8) & 0x01; +} + +void add_version_info(unsigned char *grid, int size, int version) +{ + /* Add version information */ + int i; + + long int version_data = qr_annex_d[version - 7]; + for(i = 0; i < 6; i++) { + grid[((size - 11) * size) + i] += (version_data >> (i * 3)) & 0x41; + grid[((size - 10) * size) + i] += (version_data >> ((i * 3) + 1)) & 0x41; + grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x41; + grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x41; + grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x41; + grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x41; + } +} + +int qr_code(struct zint_symbol *symbol, unsigned char source[], int length) +{ + int error_number, i, j, glyph, est_binlen; + int ecc_level, autosize, version, max_cw, target_binlen, blocks, size; + int bitmask, gs1; + +#ifndef _MSC_VER + int utfdata[length + 1]; + int jisdata[length + 1]; + char mode[length + 1]; +#else + int* utfdata = (int *)_alloca((length + 1) * sizeof(int)); + int* jisdata = (int *)_alloca((length + 1) * sizeof(int)); + char* mode = (char *)_alloca(length + 1); +#endif + + gs1 = (symbol->input_mode == GS1_MODE); + + switch(symbol->input_mode) { + case DATA_MODE: + for(i = 0; i < length; i++) { + jisdata[i] = (int)source[i]; + } + break; + default: + /* Convert Unicode input to Shift-JIS */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if(error_number != 0) { return error_number; } + + for(i = 0; i < length; i++) { + if(utfdata[i] <= 0xff) { + jisdata[i] = utfdata[i]; + } else { + j = 0; + glyph = 0; + do { + if(sjis_lookup[j * 2] == utfdata[i]) { + glyph = sjis_lookup[(j * 2) + 1]; + } + j++; + } while ((j < 6843) && (glyph == 0)); + if(glyph == 0) { + strcpy(symbol->errtxt, "Invalid character in input data"); + return ERROR_INVALID_DATA; + } + jisdata[i] = glyph; + } + } + break; + } + + define_mode(mode, jisdata, length, gs1); + est_binlen = estimate_binary_length(mode, length, gs1); + + ecc_level = LEVEL_L; + max_cw = 2956; + if((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) { + switch (symbol->option_1) { + case 1: ecc_level = LEVEL_L; max_cw = 2956; break; + case 2: ecc_level = LEVEL_M; max_cw = 2334; break; + case 3: ecc_level = LEVEL_Q; max_cw = 1666; break; + case 4: ecc_level = LEVEL_H; max_cw = 1276; break; + } + } + + if(est_binlen > (8 * max_cw)) { + strcpy(symbol->errtxt, "Input too long for selected error correction level"); + return ERROR_TOO_LONG; + } + + autosize = 40; + for(i = 39; i >= 0; i--) { + switch(ecc_level) { + case LEVEL_L: + if ((8 * qr_data_codewords_L[i]) >= est_binlen) { + autosize = i + 1; + } + break; + case LEVEL_M: + if ((8 * qr_data_codewords_M[i]) >= est_binlen) { + autosize = i + 1; + } + break; + case LEVEL_Q: + if ((8 * qr_data_codewords_Q[i]) >= est_binlen) { + autosize = i + 1; + } + break; + case LEVEL_H: + if ((8 * qr_data_codewords_H[i]) >= est_binlen) { + autosize = i + 1; + } + break; + } + } + + if((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) { + if (symbol->option_2 > autosize) { + version = symbol->option_2; + } else { + version = autosize; + } + } else { + version = autosize; + } + + /* Ensure maxium error correction capacity */ + if(est_binlen <= qr_data_codewords_M[version - 1]) { ecc_level = LEVEL_M; } + if(est_binlen <= qr_data_codewords_Q[version - 1]) { ecc_level = LEVEL_Q; } + if(est_binlen <= qr_data_codewords_H[version - 1]) { ecc_level = LEVEL_H; } + + target_binlen = qr_data_codewords_L[version - 1]; blocks = qr_blocks_L[version - 1]; + switch(ecc_level) { + case LEVEL_M: target_binlen = qr_data_codewords_M[version - 1]; blocks = qr_blocks_M[version - 1]; break; + case LEVEL_Q: target_binlen = qr_data_codewords_Q[version - 1]; blocks = qr_blocks_Q[version - 1]; break; + case LEVEL_H: target_binlen = qr_data_codewords_H[version - 1]; blocks = qr_blocks_H[version - 1]; break; + } + +#ifndef _MSC_VER + int datastream[target_binlen + 1]; + int fullstream[qr_total_codewords[version - 1] + 1]; +#else + int* datastream = (int *)_alloca((target_binlen + 1) * sizeof(int)); + int* fullstream = (int *)_alloca((qr_total_codewords[version - 1] + 1) * sizeof(int)); +#endif + + qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, est_binlen); + add_ecc(fullstream, datastream, version, target_binlen, blocks); + + size = qr_sizes[version - 1]; +#ifndef _MSC_VER + unsigned char grid[size * size]; +#else + unsigned char* grid = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); +#endif + + for(i = 0; i < size; i++) { + for(j = 0; j < size; j++) { + grid[(i * size) + j] = 0; + } + } + + setup_grid(grid, size, version); + populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]); + + if(version >= 7) { + add_version_info(grid, size, version); + } + + bitmask = apply_bitmask(grid, size, ecc_level); + + add_format_info(grid, size, ecc_level, bitmask); + + symbol->width = size; + symbol->rows = size; + + for(i = 0; i < size; i++) { + for(j = 0; j < size; j++) { + if(grid[(i * size) + j] & 0x01) { + set_module(symbol, i, j); + } + } + symbol->row_height[i] = 1; + } + + return 0; +} + +/* NOTE: From this point forward concerns Micro QR Code only */ + +int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length, int *kanji_used, int *alphanum_used, int *byte_used) +{ + /* Convert input data to an "intermediate stage" where data is binary encoded but + control information is not */ + int position = 0, debug = 0; + int short_data_block_length, i; + char data_block; + char buffer[2]; + + strcpy(binary, ""); + + if(debug) { + for(i = 0; i < length; i++) { + printf("%c", mode[i]); + } + printf("\n"); + } + + do { + if(strlen(binary) > 128) { + return ERROR_TOO_LONG; + } + + data_block = mode[position]; + short_data_block_length = 0; + do { + short_data_block_length++; + } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block)); + + switch(data_block) { + case 'K': + /* Kanji mode */ + /* Mode indicator */ + concat(binary, "K"); + *kanji_used = 1; + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + concat(binary, buffer); + + if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + for(i = 0; i < short_data_block_length; i++) { + int jis = jisdata[position + i]; + int msb, lsb, prod; + + if(jis > 0x9fff) { jis -= 0xc140; } + msb = (jis & 0xff00) >> 4; + lsb = (jis & 0xff); + prod = (msb * 0xc0) + lsb; + + qr_bscan(binary, prod, 0x1000); + + if(debug) { printf("0x%4X ", prod); } + + if(strlen(binary) > 128) { + return ERROR_TOO_LONG; + } + } + + if(debug) { printf("\n"); } + + break; + case 'B': + /* Byte mode */ + /* Mode indicator */ + concat(binary, "B"); + *byte_used = 1; + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + concat(binary, buffer); + + if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + for(i = 0; i < short_data_block_length; i++) { + int byte = jisdata[position + i]; + + qr_bscan(binary, byte, 0x80); + + if(debug) { printf("0x%4X ", byte); } + + if(strlen(binary) > 128) { + return ERROR_TOO_LONG; + } + } + + if(debug) { printf("\n"); } + + break; + case 'A': + /* Alphanumeric mode */ + /* Mode indicator */ + concat(binary, "A"); + *alphanum_used = 1; + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + concat(binary, buffer); + + if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + i = 0; + while ( i < short_data_block_length ) { + int count; + int first = 0, second = 0, prod; + + first = posn(RHODIUM, (char) jisdata[position + i]); + count = 1; + prod = first; + + if(mode[position + i + 1] == 'A') { + second = posn(RHODIUM, (char) jisdata[position + i + 1]); + count = 2; + prod = (first * 45) + second; + } + + qr_bscan(binary, prod, 1 << (5 * count)); /* count = 1..2 */ + + if(debug) { printf("0x%4X ", prod); } + + if(strlen(binary) > 128) { + return ERROR_TOO_LONG; + } + + i += 2; + }; + + if(debug) { printf("\n"); } + + break; + case 'N': + /* Numeric mode */ + /* Mode indicator */ + concat(binary, "N"); + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + concat(binary, buffer); + + if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); } + + /* Character representation */ + i = 0; + while ( i < short_data_block_length ) { + int count; + int first = 0, second = 0, third = 0, prod; + + first = posn(NEON, (char) jisdata[position + i]); + count = 1; + prod = first; + + if(mode[position + i + 1] == 'N') { + second = posn(NEON, (char) jisdata[position + i + 1]); + count = 2; + prod = (prod * 10) + second; + } + + if(mode[position + i + 2] == 'N') { + third = posn(NEON, (char) jisdata[position + i + 2]); + count = 3; + prod = (prod * 10) + third; + } + + qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */ + + if(debug) { printf("0x%4X (%d)", prod, prod); } + + if(strlen(binary) > 128) { + return ERROR_TOO_LONG; + } + + i += 3; + }; + + if(debug) { printf("\n"); } + + break; + } + + position += short_data_block_length; + } while (position < length - 1) ; + + return 0; +} + +void get_bitlength(int count[], char stream[]) { + int length, i; + + length = strlen(stream); + + for(i = 0; i < 4; i++) { + count[i] = 0; + } + + i = 0; + do { + if((stream[i] == '0') || (stream[i] == '1')) { + count[0]++; + count[1]++; + count[2]++; + count[3]++; + i++; + } else { + switch(stream[i]) { + case 'K': + count[2] += 5; + count[3] += 7; + i += 2; + break; + case 'B': + count[2] += 6; + count[3] += 8; + i += 2; + break; + case 'A': + count[1] += 4; + count[2] += 6; + count[3] += 8; + i += 2; + break; + case 'N': + count[0] += 3; + count[1] += 5; + count[2] += 7; + count[3] += 9; + i += 2; + break; + } + } + } while (i < length); +} + +void microqr_expand_binary(char binary_stream[], char full_stream[], int version) +{ + int i, length; + + length = strlen(binary_stream); + + i = 0; + do { + switch(binary_stream[i]) { + case '1': concat(full_stream, "1"); i++; break; + case '0': concat(full_stream, "0"); i++; break; + case 'N': + /* Numeric Mode */ + /* Mode indicator */ + switch(version) { + case 1: concat(full_stream, "0"); break; + case 2: concat(full_stream, "00"); break; + case 3: concat(full_stream, "000"); break; + } + + /* Character count indicator */ + qr_bscan(full_stream, binary_stream[i + 1], 4 << version); /* version = 0..3 */ + + i += 2; + break; + case 'A': + /* Alphanumeric Mode */ + /* Mode indicator */ + switch(version) { + case 1: concat(full_stream, "1"); break; + case 2: concat(full_stream, "01"); break; + case 3: concat(full_stream, "001"); break; + } + + /* Character count indicator */ + qr_bscan(full_stream, binary_stream[i + 1], 2 << version); /* version = 1..3 */ + + i += 2; + break; + case 'B': + /* Byte Mode */ + /* Mode indicator */ + switch(version) { + case 2: concat(full_stream, "10"); break; + case 3: concat(full_stream, "010"); break; + } + + /* Character count indicator */ + qr_bscan(full_stream, binary_stream[i + 1], 2 << version); /* version = 2..3 */ + + i += 2; + break; + case 'K': + /* Kanji Mode */ + /* Mode indicator */ + switch(version) { + case 2: concat(full_stream, "11"); break; + case 3: concat(full_stream, "011"); break; + } + + /* Character count indicator */ + qr_bscan(full_stream, binary_stream[i + 1], 1 << version); /* version = 2..3 */ + + i += 2; + break; + } + + } while (i < length); +} + +void micro_qr_m1(char binary_data[]) +{ + int i, latch; + int bits_total, bits_left, remainder; + int data_codewords, ecc_codewords; + unsigned char data_blocks[4], ecc_blocks[3]; + + bits_total = 20; + latch = 0; + + /* Add terminator */ + bits_left = bits_total - strlen(binary_data); + if(bits_left <= 3) { + for(i = 0; i < bits_left; i++) { + concat(binary_data, "0"); + } + latch = 1; + } else { + concat(binary_data, "000"); + } + + if(latch == 0) { + /* Manage last (4-bit) block */ + bits_left = bits_total - strlen(binary_data); + if(bits_left <= 4) { + for(i = 0; i < bits_left; i++) { + concat(binary_data, "0"); + } + latch = 1; + } + } + + if(latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if(remainder == 8) { remainder = 0; } + for(i = 0; i < remainder; i++) { + concat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - strlen(binary_data); + if(bits_left > 4) { + remainder = (bits_left - 4) / 8; + for(i = 0; i < remainder; i++) { + concat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + concat(binary_data, "0000"); + } + + data_codewords = 3; + ecc_codewords = 2; + + /* Copy data into codewords */ + for(i = 0; i < (data_codewords - 1); i++) { + data_blocks[i] = 0; + if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } + if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } + if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } + if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } + if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } + if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } + if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } + if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } + } + data_blocks[2] = 0; + if(binary_data[16] == '1') { data_blocks[2] += 0x08; } + if(binary_data[17] == '1') { data_blocks[2] += 0x04; } + if(binary_data[18] == '1') { data_blocks[2] += 0x02; } + if(binary_data[19] == '1') { data_blocks[2] += 0x01; } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords,data_blocks,ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for(i = 0; i < ecc_codewords; i++) { + qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); + } +} + +void micro_qr_m2(char binary_data[], int ecc_mode) +{ + int i, latch; + int bits_total, bits_left, remainder; + int data_codewords, ecc_codewords; + unsigned char data_blocks[6], ecc_blocks[7]; + + latch = 0; + + if(ecc_mode == LEVEL_L) { bits_total = 40; } + if(ecc_mode == LEVEL_M) { bits_total = 32; } + + /* Add terminator */ + bits_left = bits_total - strlen(binary_data); + if(bits_left <= 5) { + for(i = 0; i < bits_left; i++) { + concat(binary_data, "0"); + } + latch = 1; + } else { + concat(binary_data, "00000"); + } + + if(latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if(remainder == 8) { remainder = 0; } + for(i = 0; i < remainder; i++) { + concat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - strlen(binary_data); + remainder = bits_left / 8; + for(i = 0; i < remainder; i++) { + concat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + + if(ecc_mode == LEVEL_L) { data_codewords = 5; ecc_codewords = 5; } + if(ecc_mode == LEVEL_M) { data_codewords = 4; ecc_codewords = 6; } + + /* Copy data into codewords */ + for(i = 0; i < data_codewords; i++) { + data_blocks[i] = 0; + if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } + if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } + if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } + if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } + if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } + if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } + if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } + if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords,data_blocks,ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for(i = 0; i < ecc_codewords; i++) { + qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); + } + + return; +} + +void micro_qr_m3(char binary_data[], int ecc_mode) +{ + int i, latch; + int bits_total, bits_left, remainder; + int data_codewords, ecc_codewords; + unsigned char data_blocks[12], ecc_blocks[9]; + + latch = 0; + + if(ecc_mode == LEVEL_L) { bits_total = 84; } + if(ecc_mode == LEVEL_M) { bits_total = 68; } + + /* Add terminator */ + bits_left = bits_total - strlen(binary_data); + if(bits_left <= 7) { + for(i = 0; i < bits_left; i++) { + concat(binary_data, "0"); + } + latch = 1; + } else { + concat(binary_data, "0000000"); + } + + if(latch == 0) { + /* Manage last (4-bit) block */ + bits_left = bits_total - strlen(binary_data); + if(bits_left <= 4) { + for(i = 0; i < bits_left; i++) { + concat(binary_data, "0"); + } + latch = 1; + } + } + + if(latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if(remainder == 8) { remainder = 0; } + for(i = 0; i < remainder; i++) { + concat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - strlen(binary_data); + if(bits_left > 4) { + remainder = (bits_left - 4) / 8; + for(i = 0; i < remainder; i++) { + concat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + concat(binary_data, "0000"); + } + + if(ecc_mode == LEVEL_L) { data_codewords = 11; ecc_codewords = 6; } + if(ecc_mode == LEVEL_M) { data_codewords = 9; ecc_codewords = 8; } + + /* Copy data into codewords */ + for(i = 0; i < (data_codewords - 1); i++) { + data_blocks[i] = 0; + if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } + if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } + if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } + if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } + if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } + if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } + if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } + if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } + } + + if(ecc_mode == LEVEL_L) { + data_blocks[11] = 0; + if(binary_data[80] == '1') { data_blocks[2] += 0x08; } + if(binary_data[81] == '1') { data_blocks[2] += 0x04; } + if(binary_data[82] == '1') { data_blocks[2] += 0x02; } + if(binary_data[83] == '1') { data_blocks[2] += 0x01; } + } + + if(ecc_mode == LEVEL_M) { + data_blocks[9] = 0; + if(binary_data[64] == '1') { data_blocks[2] += 0x08; } + if(binary_data[65] == '1') { data_blocks[2] += 0x04; } + if(binary_data[66] == '1') { data_blocks[2] += 0x02; } + if(binary_data[67] == '1') { data_blocks[2] += 0x01; } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords,data_blocks,ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for(i = 0; i < ecc_codewords; i++) { + qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); + } + + return; +} + +void micro_qr_m4(char binary_data[], int ecc_mode) +{ + int i, latch; + int bits_total, bits_left, remainder; + int data_codewords, ecc_codewords; + unsigned char data_blocks[17], ecc_blocks[15]; + + latch = 0; + + if(ecc_mode == LEVEL_L) { bits_total = 128; } + if(ecc_mode == LEVEL_M) { bits_total = 112; } + if(ecc_mode == LEVEL_Q) { bits_total = 80; } + + /* Add terminator */ + bits_left = bits_total - strlen(binary_data); + if(bits_left <= 9) { + for(i = 0; i < bits_left; i++) { + concat(binary_data, "0"); + } + latch = 1; + } else { + concat(binary_data, "000000000"); + } + + if(latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if(remainder == 8) { remainder = 0; } + for(i = 0; i < remainder; i++) { + concat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - strlen(binary_data); + remainder = bits_left / 8; + for(i = 0; i < remainder; i++) { + concat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + + if(ecc_mode == LEVEL_L) { data_codewords = 16; ecc_codewords = 8; } + if(ecc_mode == LEVEL_M) { data_codewords = 14; ecc_codewords = 10; } + if(ecc_mode == LEVEL_Q) { data_codewords = 10; ecc_codewords = 14; } + + /* Copy data into codewords */ + for(i = 0; i < data_codewords; i++) { + data_blocks[i] = 0; + if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } + if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } + if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } + if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } + if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } + if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } + if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } + if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords,data_blocks,ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for(i = 0; i < ecc_codewords; i++) { + qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); + } +} + +void micro_setup_grid(unsigned char* grid, int size) +{ + int i, toggle = 1; + + /* Add timing patterns */ + for(i = 0; i < size; i++) { + if(toggle == 1) { + grid[i] = 0x21; + grid[(i * size)] = 0x21; + toggle = 0; + } else { + grid[i] = 0x20; + grid[(i * size)] = 0x20; + toggle = 1; + } + } + + /* Add finder patterns */ + place_finder(grid, size, 0, 0); + + /* Add separators */ + for(i = 0; i < 7; i++) { + grid[(7 * size) + i] = 0x10; + grid[(i * size) + 7] = 0x10; + } + grid[(7 * size) + 7] = 0x10; + + + /* Reserve space for format information */ + for(i = 0; i < 8; i++) { + grid[(8 * size) + i] += 0x20; + grid[(i * size) + 8] += 0x20; + } + grid[(8 * size) + 8] += 20; +} + +void micro_populate_grid(unsigned char* grid, int size, char full_stream[]) +{ + int direction = 1; /* up */ + int row = 0; /* right hand side */ + + int i, n, x, y; + + n = strlen(full_stream); + y = size - 1; + i = 0; + do { + x = (size - 2) - (row * 2); + + if(!(grid[(y * size) + (x + 1)] & 0xf0)) { + if (full_stream[i] == '1') { + grid[(y * size) + (x + 1)] = 0x01; + } else { + grid[(y * size) + (x + 1)] = 0x00; + } + i++; + } + + if(i < n) { + if(!(grid[(y * size) + x] & 0xf0)) { + if (full_stream[i] == '1') { + grid[(y * size) + x] = 0x01; + } else { + grid[(y * size) + x] = 0x00; + } + i++; + } + } + + if(direction) { y--; } else { y++; } + if(y == 0) { + /* reached the top */ + row++; + y = 1; + direction = 0; + } + if(y == size) { + /* reached the bottom */ + row++; + y = size - 1; + direction = 1; + } + } while (i < n); +} + +int micro_evaluate(unsigned char *grid, int size, int pattern) +{ + int sum1, sum2, i, filter = 0, retval; + + switch(pattern) { + case 0: filter = 0x01; break; + case 1: filter = 0x02; break; + case 2: filter = 0x04; break; + case 3: filter = 0x08; break; + } + + sum1 = 0; + sum2 = 0; + for(i = 1; i < size; i++) { + if(grid[(i * size) + size - 1] & filter) { sum1++; } + if(grid[((size - 1) * size) + i] & filter) { sum2++; } + } + + if(sum1 <= sum2) { retval = (sum1 * 16) + sum2; } else { retval = (sum2 * 16) + sum1; } + + return retval; +} + +int micro_apply_bitmask(unsigned char *grid, int size) +{ + int x, y; + unsigned char p; + int pattern, value[8]; + int best_val, best_pattern; + int bit; + +#ifndef _MSC_VER + unsigned char mask[size * size]; + unsigned char eval[size * size]; +#else + unsigned char* mask = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); + unsigned char* eval = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); +#endif + + /* Perform data masking */ + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + mask[(y * size) + x] = 0x00; + + if (!(grid[(y * size) + x] & 0xf0)) { + if((y & 1) == 0) { + mask[(y * size) + x] += 0x01; + } + + if((((y / 2) + (x / 3)) & 1) == 0) { + mask[(y * size) + x] += 0x02; + } + + if(((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { + mask[(y * size) + x] += 0x04; + } + + if(((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { + mask[(y * size) + x] += 0x08; + } + } + } + } + + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; } + + eval[(y * size) + x] = mask[(y * size) + x] ^ p; + } + } + + + /* Evaluate result */ + for(pattern = 0; pattern < 8; pattern++) { + value[pattern] = micro_evaluate(eval, size, pattern); + } + + best_pattern = 0; + best_val = value[0]; + for(pattern = 1; pattern < 4; pattern++) { + if(value[pattern] > best_val) { + best_pattern = pattern; + best_val = value[pattern]; + } + } + + /* Apply mask */ + for(x = 0; x < size; x++) { + for(y = 0; y < size; y++) { + bit = 0; + switch(best_pattern) { + case 0: if(mask[(y * size) + x] & 0x01) { bit = 1; } break; + case 1: if(mask[(y * size) + x] & 0x02) { bit = 1; } break; + case 2: if(mask[(y * size) + x] & 0x04) { bit = 1; } break; + case 3: if(mask[(y * size) + x] & 0x08) { bit = 1; } break; + } + if(bit == 1) { + if(grid[(y * size) + x] & 0x01) { + grid[(y * size) + x] = 0x00; + } else { + grid[(y * size) + x] = 0x01; + } + } + } + } + + return best_pattern; +} + +int microqr(struct zint_symbol *symbol, unsigned char source[], int length) +{ + int i, j, glyph, size; + char binary_stream[200]; + char full_stream[200]; + int utfdata[40]; + int jisdata[40]; + char mode[40]; + int error_number, kanji_used = 0, alphanum_used = 0, byte_used = 0; + int version_valid[4]; + int binary_count[4]; + int ecc_level, autoversion, version; + int n_count, a_count, bitmask, format, format_full; + + if(length > 35) { + strcpy(symbol->errtxt, "Input data too long"); + return ERROR_TOO_LONG; + } + + for(i = 0; i < 4; i++) { + version_valid[i] = 1; + } + + switch(symbol->input_mode) { + case DATA_MODE: + for(i = 0; i < length; i++) { + jisdata[i] = (int)source[i]; + } + break; + default: + /* Convert Unicode input to Shift-JIS */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if(error_number != 0) { return error_number; } + + for(i = 0; i < length; i++) { + if(utfdata[i] <= 0xff) { + jisdata[i] = utfdata[i]; + } else { + j = 0; + glyph = 0; + do { + if(sjis_lookup[j * 2] == utfdata[i]) { + glyph = sjis_lookup[(j * 2) + 1]; + } + j++; + } while ((j < 6843) && (glyph == 0)); + if(glyph == 0) { + strcpy(symbol->errtxt, "Invalid character in input data"); + return ERROR_INVALID_DATA; + } + jisdata[i] = glyph; + } + } + break; + } + + define_mode(mode, jisdata, length, 0); + + n_count = 0; + a_count = 0; + for(i = 0; i < length; i++) { + if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { n_count++; } + if(in_alpha(jisdata[i])) { a_count++; } + } + + if(a_count == length) { + /* All data can be encoded in Alphanumeric mode */ + for(i = 0; i < length; i++) { + mode[i] = 'A'; + } + } + + if(n_count == length) { + /* All data can be encoded in Numeric mode */ + for(i = 0; i < length; i++) { + mode[i] = 'N'; + } + } + + error_number = micro_qr_intermediate(binary_stream, jisdata, mode, length, &kanji_used, &alphanum_used, &byte_used); + if(error_number != 0) { + strcpy(symbol->errtxt, "Input data too long"); + return error_number; + } + + get_bitlength(binary_count, binary_stream); + + /* Eliminate possivle versions depending on type of content */ + if(byte_used) { + version_valid[0] = 0; + version_valid[1] = 0; + } + + if(alphanum_used) { + version_valid[0] = 0; + } + + if(kanji_used) { + version_valid[0] = 0; + version_valid[1] = 0; + } + + /* Eliminate possible versions depending on length of binary data */ + if(binary_count[0] > 20) { version_valid[0] = 0; } + if(binary_count[1] > 40) { version_valid[1] = 0; } + if(binary_count[2] > 84) { version_valid[2] = 0; } + if(binary_count[3] > 128) { + strcpy(symbol->errtxt, "Input data too long"); + return ERROR_TOO_LONG; + } + + /* Eliminate possible versions depending on error correction level specified */ + ecc_level = LEVEL_L; + if((symbol->option_1 >= 1) && (symbol->option_2 <= 4)) { + ecc_level = symbol->option_1; + } + + if(ecc_level == LEVEL_H) { + strcpy(symbol->errtxt, "Error correction level H not available"); + return ERROR_INVALID_OPTION; + } + + if(ecc_level == LEVEL_Q) { + version_valid[0] = 0; + version_valid[1] = 0; + version_valid[2] = 0; + if(binary_count[3] > 80) { + strcpy(symbol->errtxt, "Input data too long"); + return ERROR_TOO_LONG; + } + } + + if(ecc_level == LEVEL_M) { + version_valid[0] = 0; + if(binary_count[1] > 32) { version_valid[1] = 0; } + if(binary_count[2] > 68) { version_valid[2] = 0; } + if(binary_count[3] > 112) { + strcpy(symbol->errtxt, "Input data too long"); + return ERROR_TOO_LONG; + } + } + + autoversion = 3; + if(version_valid[2]) { autoversion = 2; } + if(version_valid[1]) { autoversion = 1; } + if(version_valid[0]) { autoversion = 0; } + + version = autoversion; + /* Get version from user */ + if((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { + if(symbol->option_2 >= autoversion) { + version = symbol->option_2; + } + } + + /* If there is enough unused space then increase the error correction level */ + if(version == 3) { + if(binary_count[3] <= 112) { ecc_level = LEVEL_M; } + if(binary_count[3] <= 80) { ecc_level = LEVEL_Q; } + } + + if(version == 2) { + if(binary_count[2] <= 68) { ecc_level = LEVEL_M; } + } + + if(version == 1) { + if(binary_count[1] <= 32) { ecc_level = LEVEL_M; } + } + + strcpy(full_stream, ""); + microqr_expand_binary(binary_stream, full_stream, version); + + switch(version) { + case 0: micro_qr_m1(full_stream); break; + case 1: micro_qr_m2(full_stream, ecc_level); break; + case 2: micro_qr_m3(full_stream, ecc_level); break; + case 3: micro_qr_m4(full_stream, ecc_level); break; + } + + size = micro_qr_sizes[version]; +#ifndef _MSC_VER + unsigned char grid[size * size]; +#else + unsigned char* grid = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); +#endif + + for(i = 0; i < size; i++) { + for(j = 0; j < size; j++) { + grid[(i * size) + j] = 0; + } + } + + micro_setup_grid(grid, size); + micro_populate_grid(grid, size, full_stream); + bitmask = micro_apply_bitmask(grid, size); + + /* Add format data */ + format = 0; + switch(version) { + case 1: switch(ecc_level) { + case 1: format = 1; break; + case 2: format = 2; break; + } + break; + case 2: switch(ecc_level) { + case 1: format = 3; break; + case 2: format = 4; break; + } + break; + case 3: switch(ecc_level) { + case 1: format = 5; break; + case 2: format = 6; break; + case 3: format = 7; break; + } + break; + } + + format_full = qr_annex_c1[(format << 2) + bitmask]; + + if(format_full & 0x4000) { grid[(8 * size) + 1] += 0x01; } + if(format_full & 0x2000) { grid[(8 * size) + 2] += 0x01; } + if(format_full & 0x1000) { grid[(8 * size) + 3] += 0x01; } + if(format_full & 0x800) { grid[(8 * size) + 4] += 0x01; } + if(format_full & 0x400) { grid[(8 * size) + 5] += 0x01; } + if(format_full & 0x200) { grid[(8 * size) + 6] += 0x01; } + if(format_full & 0x100) { grid[(8 * size) + 7] += 0x01; } + if(format_full & 0x80) { grid[(8 * size) + 8] += 0x01; } + if(format_full & 0x40) { grid[(7 * size) + 8] += 0x01; } + if(format_full & 0x20) { grid[(6 * size) + 8] += 0x01; } + if(format_full & 0x10) { grid[(5 * size) + 8] += 0x01; } + if(format_full & 0x08) { grid[(4 * size) + 8] += 0x01; } + if(format_full & 0x04) { grid[(3 * size) + 8] += 0x01; } + if(format_full & 0x02) { grid[(2 * size) + 8] += 0x01; } + if(format_full & 0x01) { grid[(1 * size) + 8] += 0x01; } + + symbol->width = size; + symbol->rows = size; + + for(i = 0; i < size; i++) { + for(j = 0; j < size; j++) { + if(grid[(i * size) + j] & 0x01) { + set_module(symbol, i, j); + } + } + symbol->row_height[i] = 1; + } + + return 0; +} diff --git a/backend/qr.h b/backend/qr.h new file mode 100644 index 0000000..0efb263 --- /dev/null +++ b/backend/qr.h @@ -0,0 +1,167 @@ +/* qr.h Data for QR Code */ + +/* + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + Copyright (C) 2006 Kentaro Fukuchi <fukuchi@megaui.net> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#define LEVEL_L 1 +#define LEVEL_M 2 +#define LEVEL_Q 3 +#define LEVEL_H 4 + +#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" + +/* From ISO/IEC 18004:2006 Table 7 */ +static int qr_data_codewords_L[] = { + 19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647, + 721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631, + 1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956 +}; + +static int qr_data_codewords_M[] = { + 16, 28, 44, 64, 86, 108, 124, 154, 182, 216, 254, 290, 334, 365, 415, 453, 507, + 563, 627, 669, 714, 782, 860, 914, 1000, 1062, 1128, 1193, 1267, + 1373, 1455, 1541, 1631, 1725, 1812, 1914, 1992, 2102, 2216, 2334 +}; + +static int qr_data_codewords_Q[] = { + 13, 22, 34, 48, 62, 76, 88, 110, 132, 154, 180, 206, 244, 261, 295, 325, 367, + 397, 445, 485, 512, 568, 614, 664, 718, 754, 808, 871, 911, + 985, 1033, 1115, 1171, 1231, 1286, 1354, 1426, 1502, 1582, 1666 +}; + +static int qr_data_codewords_H[] = { + 9, 16, 26, 36, 46, 60, 66, 86, 100, 122, 140, 158, 180, 197, 223, 253, 283, + 313, 341, 385, 406, 442, 464, 514, 538, 596, 628, 661, 701, + 745, 793, 845, 901, 961, 986, 1054, 1096, 1142, 1222, 1276 +}; + +static int qr_total_codewords[] = { + 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815, + 901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, + 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706 +}; + +static int qr_blocks_L[] = { + 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, + 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25 +}; + +static int qr_blocks_M[] = { + 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, + 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49 +}; + +static int qr_blocks_Q[] = { + 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, + 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68 +}; + +static int qr_blocks_H[] = { + 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, + 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81 +}; + +static int qr_sizes[] = { + 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, + 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177 +}; + +static int micro_qr_sizes[] = { + 11, 13, 15, 17 +}; + +static int qr_align_loopsize[] = { + 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 +}; + +static int qr_table_e1[] = { + 6, 18, 0, 0, 0, 0, 0, + 6, 22, 0, 0, 0, 0, 0, + 6, 26, 0, 0, 0, 0, 0, + 6, 30, 0, 0, 0, 0, 0, + 6, 34, 0, 0, 0, 0, 0, + 6, 22, 38, 0, 0, 0, 0, + 6, 24, 42, 0, 0, 0, 0, + 6, 26, 46, 0, 0, 0, 0, + 6, 28, 50, 0, 0, 0, 0, + 6, 30, 54, 0, 0, 0, 0, + 6, 32, 58, 0, 0, 0, 0, + 6, 34, 62, 0, 0, 0, 0, + 6, 26, 46, 66, 0, 0, 0, + 6, 26, 48, 70, 0, 0, 0, + 6, 26, 50, 74, 0, 0, 0, + 6, 30, 54, 78, 0, 0, 0, + 6, 30, 56, 82, 0, 0, 0, + 6, 30, 58, 86, 0, 0, 0, + 6, 34, 62, 90, 0, 0, 0, + 6, 28, 50, 72, 94, 0, 0, + 6, 26, 50, 74, 98, 0, 0, + 6, 30, 54, 78, 102, 0, 0, + 6, 28, 54, 80, 106, 0, 0, + 6, 32, 58, 84, 110, 0, 0, + 6, 30, 58, 86, 114, 0, 0, + 6, 34, 62, 90, 118, 0, 0, + 6, 26, 50, 74, 98, 122, 0, + 6, 30, 54, 78, 102, 126, 0, + 6, 26, 52, 78, 104, 130, 0, + 6, 30, 56, 82, 108, 134, 0, + 6, 34, 60, 86, 112, 138, 0, + 6, 30, 58, 86, 114, 142, 0, + 6, 34, 62, 90, 118, 146, 0, + 6, 30, 54, 78, 102, 126, 150, + 6, 24, 50, 76, 102, 128, 154, + 6, 28, 54, 80, 106, 132, 158, + 6, 32, 58, 84, 110, 136, 162, + 6, 26, 54, 82, 110, 138, 166, + 6, 30, 58, 86, 114, 142, 170 +}; + +static unsigned int qr_annex_c[] = { + /* Format information bit sequences */ + 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d, + 0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b, + 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed +}; + +static long int qr_annex_d[] = { + /* Version information bit sequences */ + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, + 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, + 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, + 0x2542e, 0x26a64, 0x27541, 0x28c69 +}; + +static int qr_annex_c1[] = { + /* Micro QR Code format information */ + 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f, + 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3, + 0x31d4, 0x3e8d, 0x3bba +};
\ No newline at end of file diff --git a/backend/reedsol.c b/backend/reedsol.c new file mode 100644 index 0000000..ef9e402 --- /dev/null +++ b/backend/reedsol.c @@ -0,0 +1,171 @@ +/** + + This is a simple Reed-Solomon encoder + (C) Cliff Hones 2004 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +// It is not written with high efficiency in mind, so is probably +// not suitable for real-time encoding. The aim was to keep it +// simple, general and clear. +// +// <Some notes on the theory and implementation need to be added here> + +// Usage: +// First call rs_init_gf(poly) to set up the Galois Field parameters. +// Then call rs_init_code(size, index) to set the encoding size +// Then call rs_encode(datasize, data, out) to encode the data. +// +// These can be called repeatedly as required - but note that +// rs_init_code must be called following any rs_init_gf call. +// +// If the parameters are fixed, some of the statics below can be +// replaced with constants in the obvious way, and additionally +// malloc/free can be avoided by using static arrays of a suitable +// size. + +#include <stdio.h> // only needed for debug (main) +#include <stdlib.h> // only needed for malloc/free +#include "reedsol.h" +static int gfpoly; +static int symsize; // in bits +static int logmod; // 2**symsize - 1 +static int rlen; + +static int *logt = NULL, *alog = NULL, *rspoly = NULL; + +// rs_init_gf(poly) initialises the parameters for the Galois Field. +// The symbol size is determined from the highest bit set in poly +// This implementation will support sizes up to 30 bits (though that +// will result in very large log/antilog tables) - bit sizes of +// 8 or 4 are typical +// +// The poly is the bit pattern representing the GF characteristic +// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is +// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d. + +void rs_init_gf(int poly) +{ + int m, b, p, v; + + // Find the top bit, and hence the symbol size + for (b = 1, m = 0; b <= poly; b <<= 1) + m++; + b >>= 1; + m--; + gfpoly = poly; + symsize = m; + + // Calculate the log/alog tables + logmod = (1 << m) - 1; + logt = (int *)malloc(sizeof(int) * (logmod + 1)); + alog = (int *)malloc(sizeof(int) * logmod); + + for (p = 1, v = 0; v < logmod; v++) { + alog[v] = p; + logt[p] = v; + p <<= 1; + if (p & b) + p ^= poly; + } +} + +// rs_init_code(nsym, index) initialises the Reed-Solomon encoder +// nsym is the number of symbols to be generated (to be appended +// to the input data). index is usually 1 - it is the index of +// the constant in the first term (i) of the RS generator polynomial: +// (x + 2**i)*(x + 2**(i+1))*... [nsym terms] +// For ECC200, index is 1. + +void rs_init_code(int nsym, int index) +{ + int i, k; + + rspoly = (int *)malloc(sizeof(int) * (nsym + 1)); + + rlen = nsym; + + rspoly[0] = 1; + for (i = 1; i <= nsym; i++) { + rspoly[i] = 1; + for (k = i - 1; k > 0; k--) { + if (rspoly[k]) + rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod]; + rspoly[k] ^= rspoly[k - 1]; + } + rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod]; + index++; + } +} + +void rs_encode(int len, unsigned char *data, unsigned char *res) +{ + int i, k, m; + for (i = 0; i < rlen; i++) + res[i] = 0; + for (i = 0; i < len; i++) { + m = res[rlen - 1] ^ data[i]; + for (k = rlen - 1; k > 0; k--) { + if (m && rspoly[k]) + res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]; + else + res[k] = res[k - 1]; + } + if (m && rspoly[0]) + res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod]; + else + res[0] = 0; + } +} + +void rs_encode_long(int len, unsigned int *data, unsigned int *res) +{ /* The same as above but for larger bitlengths - Aztec code compatible */ + int i, k, m; + for (i = 0; i < rlen; i++) + res[i] = 0; + for (i = 0; i < len; i++) { + m = res[rlen - 1] ^ data[i]; + for (k = rlen - 1; k > 0; k--) { + if (m && rspoly[k]) + res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]; + else + res[k] = res[k - 1]; + } + if (m && rspoly[0]) + res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod]; + else + res[0] = 0; + } +} + +void rs_free(void) +{ /* Free memory */ + free(logt); + free(alog); + free(rspoly); + rspoly = NULL; +} diff --git a/backend/reedsol.h b/backend/reedsol.h new file mode 100644 index 0000000..d61af2c --- /dev/null +++ b/backend/reedsol.h @@ -0,0 +1,51 @@ +/* + + This is a simple Reed-Solomon encoder + (C) Cliff Hones 2004 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +*/ + +#ifndef __REEDSOL_H +#define __REEDSOL_H + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern void rs_init_gf(int poly); +extern void rs_init_code(int nsym, int index); +extern void rs_encode(int len, unsigned char *data, unsigned char *res); +extern void rs_encode_long(int len, unsigned int *data, unsigned int *res); +extern void rs_free(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __REEDSOL_H */ diff --git a/backend/render.c b/backend/render.c new file mode 100644 index 0000000..6c7968c --- /dev/null +++ b/backend/render.c @@ -0,0 +1,792 @@ +/* + * render.c - Generic Rendered Format + * + * Initiall written by Sam Lown for use in gLabels. Converts encoded + * data into a generic internal structure of lines and characters + * usable in external applications. + */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <locale.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include "common.h" + +#define GL_CONST 2.8346 + +struct zint_render_line *render_plot_create_line(float x, float y, float width, float length); +int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line); +struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width); +int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring); +struct zint_render_hexagon *render_plot_create_hexagon(float x, float y); +int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *ring, struct zint_render_hexagon **last_hexagon); + +int render_plot_add_string(struct zint_symbol *symbol, unsigned char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string); + +int render_plot(struct zint_symbol *symbol, float width, float height) +{ + struct zint_render *render; + struct zint_render_line *line, *last_line = NULL; + struct zint_render_string *last_string = NULL; + struct zint_render_ring *ring, *last_ring = NULL; + struct zint_render_hexagon *hexagon, *last_hexagon = NULL; + + int i, r, block_width, latch, this_row; + float textpos, textwidth, large_bar_height, preset_height, row_height, row_posn = 0.0; + // int error_number = 0; + int text_offset, text_height, xoffset, yoffset, textdone, main_symbol_width_x, addon_width_x; + char addon[6], textpart[10]; + int large_bar_count, symbol_lead_in, total_symbol_width_x, total_area_width_x; + float addon_text_posn; + float default_text_posn; + float scaler; + const char *locale = NULL; + int hide_text = 0; + float required_aspect; + float symbol_aspect = 1; + float x_dimension; + int upceanflag = 0; + + // Allocate memory for the rendered version + render = symbol->rendered = (struct zint_render*)malloc(sizeof(struct zint_render)); + render->lines = NULL; + render->strings = NULL; + render->rings = NULL; + render->hexagons = NULL; + + locale = setlocale(LC_ALL, "C"); + + row_height = 0; + textdone = 0; + textpos = 0.0; + main_symbol_width_x = symbol->width; + strcpy(addon, ""); + symbol_lead_in = 0; + addon_text_posn = 0.0; + addon_width_x = 0; + + /* + * Determine if there will be any addon texts and text height + */ + latch = 0; + r = 0; + /* Isolate add-on text */ + if(is_extendable(symbol->symbology)) { + for(i = 0; i < ustrlen(symbol->text); i++) { + if (latch == 1) { + addon[r] = symbol->text[i]; + r++; + } + if (symbol->text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) { + hide_text = 1; + text_height = text_offset = 0.0; + } else { + text_height = 9.0; + text_offset = 2.0; + } + + + /* + * Calculate the width of the barcode, especially if there are any extra + * borders or white space to add. + */ + + while(!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) { + symbol_lead_in++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch(ustrlen(symbol->text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_symbol_width_x = 96 + symbol_lead_in; + upceanflag = 13; + break; + case 2: + main_symbol_width_x = 22 + symbol_lead_in; + upceanflag = 2; + break; + case 5: + main_symbol_width_x = 49 + symbol_lead_in; + upceanflag = 5; + break; + default: + main_symbol_width_x = 68 + symbol_lead_in; + upceanflag = 8; + } + switch(ustrlen(symbol->text)) { + case 11: + case 16: + /* EAN-2 add-on */ + addon_width_x = 31; + break; + case 14: + case 19: + /* EAN-5 add-on */ + addon_width_x = 58; + break; + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + upceanflag = 12; + if(symbol->whitespace_width < 10) { + symbol->whitespace_width = 10; + main_symbol_width_x = 96 + symbol_lead_in; + } + switch(ustrlen(symbol->text)) { + case 15: + /* EAN-2 add-on */ + addon_width_x = 31; + break; + case 18: + /* EAN-5 add-on */ + addon_width_x = 58; + break; + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + upceanflag = 6; + if(symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_symbol_width_x = 51 + symbol_lead_in; + } + switch(ustrlen(symbol->text)) { + case 11: + /* EAN-2 add-on */ + addon_width_x = 31; + break; + case 14: + /* EAN-5 add-on */ + addon_width_x = 58; + break; + } + } + + total_symbol_width_x = main_symbol_width_x + addon_width_x; + total_area_width_x = total_symbol_width_x + (2 * (symbol->border_width + symbol->whitespace_width)); + + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + + // Determine if height should be overridden + large_bar_count = 0; + preset_height = 0.0; + for(i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if(symbol->row_height[i] == 0) { + large_bar_count++; + } + } + + if (large_bar_count == 0) { + required_aspect = width / height; + symbol_aspect = (total_symbol_width_x + (2 * xoffset)) / (preset_height + (2 * yoffset) + text_offset + text_height); + symbol->height = preset_height; + if (required_aspect > symbol_aspect) { + /* the area is too wide */ + scaler = height / (preset_height + (2 * yoffset) + text_offset + text_height); + render->width = symbol_aspect * height; + render->height = height; + } else { + /* the area is too high */ + scaler = width / (total_symbol_width_x + (2 * xoffset)); + render->width = width; + render->height = width / symbol_aspect; + } + } else { + scaler = width / (total_symbol_width_x + (2 * xoffset)); + symbol->height = (height / scaler) - ((2 * yoffset) + text_offset + text_height); + + render->width = width; + render->height = height; + } + large_bar_height = (symbol->height - preset_height) / large_bar_count; + + if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + default_text_posn = (symbol->height + text_offset + symbol->border_width + symbol->border_width) * scaler; + } else { + default_text_posn = (symbol->height + text_offset + symbol->border_width) * scaler; + } + + x_dimension = render->width / total_area_width_x; + x_dimension /= GL_CONST; + + /* Set minimum size of symbol */ + /* Barcode must be at least 2mm high by 2mm across */ + if(render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST) { + render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST; + } + if(render->width < (2.0 * GL_CONST)) { + render->width = (2.0 * GL_CONST); + } + + if(symbol->symbology == BARCODE_CODABAR) { + /* The minimum X-dimension of Codabar is 0.191mm. The minimum bar height is 5mm */ + if(x_dimension < 0.191) { + render->width = 0.191 * GL_CONST * total_area_width_x; + } + if(render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST) { + render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST; + } + } + + if(symbol->symbology == BARCODE_CODE49) { + /* The minimum X-dimension of Code 49 is 0.191mm */ + if(x_dimension < 0.191) { + render->width = 0.191 * GL_CONST * total_area_width_x; + render->height = render->width / symbol_aspect; + } + } + + if(upceanflag != 0) { + /* The X-dimension of UPC/EAN symbols is fixed at 0.330mm */ + /* NOTE: This code will need adjustment before it correctly deals with composite symbols */ + render->width = 0.330 * GL_CONST * total_area_width_x; + /* The height is also fixed */ + switch (upceanflag) { + case 6: + case 12: + case 13: + /* UPC-A, UPC-E and EAN-13 */ + /* Height of bars should be 22.85mm */ + render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 22.85) * GL_CONST; + break; + case 8: + /* EAN-8 */ + /* Height of bars should be 18.23mm */ + render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 18.23) * GL_CONST; + break; + default: + /* EAN-2 and EAN-5 */ + /* Height of bars should be 21.10mm */ + render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 21.10) * GL_CONST; + } + } + + if(symbol->symbology == BARCODE_ONECODE) { + /* The size of USPS Intelligent Mail barcode is fixed */ + render->width = 0.508 * GL_CONST * total_area_width_x; + render->height = 4.064 * GL_CONST; + } + + if((symbol->symbology == BARCODE_POSTNET) || (symbol->symbology == BARCODE_PLANET)) { + /* The size of PostNet and PLANET are fized */ + render->width = 0.508 * GL_CONST * total_area_width_x; + render->height = 2.921 * GL_CONST; + } + + if(((symbol->symbology == BARCODE_AUSPOST) || (symbol->symbology == BARCODE_AUSREPLY)) || + ((symbol->symbology == BARCODE_AUSROUTE) || (symbol->symbology == BARCODE_AUSREDIRECT))) { + /* Australia Post use the same sizes as USPS */ + render->width = 0.508 * GL_CONST * total_area_width_x; + render->height = 4.064 * GL_CONST; + } + + if((symbol->symbology == BARCODE_RM4SCC) || (symbol->symbology == BARCODE_KIX)) { + /* Royal Mail and KIX Code uses 22 bars per inch */ + render->width = 0.577 * GL_CONST * total_area_width_x; + render->height = 5.22 * GL_CONST; + } + + if(symbol->symbology == BARCODE_MAXICODE) { + /* Maxicode is a fixed size */ + scaler = GL_CONST; /* Converts from millimeters to the scale used by glabels */ + render->width = 28.16 * scaler; + render->height = 26.86 * scaler; + + /* Central bullseye pattern */ + ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 0.85 * scaler, 0.67 * scaler); + render_plot_add_ring(symbol, ring, &last_ring); + ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 2.20 * scaler, 0.67 * scaler); + render_plot_add_ring(symbol, ring, &last_ring); + ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 3.54 * scaler, 0.67 * scaler); + render_plot_add_ring(symbol, ring, &last_ring); + + /* Hexagons */ + for(r = 0; r < symbol->rows; r++) { + for(i = 0; i < symbol->width; i++) { + if(module_is_set(symbol, r, i)) { + hexagon = render_plot_create_hexagon(((i * 0.88) + (r & 1 ? 1.76 : 1.32)) * scaler, ((r * 0.76) + 0.76) * scaler); + render_plot_add_hexagon(symbol, hexagon, &last_hexagon); + } + } + } + + } else { + /* everything else uses rectangles (or squares) */ + /* Works from the bottom of the symbol up */ + int addon_latch = 0; + + for(r = 0; r < symbol->rows; r++) { + this_row = r; + if(symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + row_posn = 0; + for(i = 0; i < r; i++) { + if(symbol->row_height[i] == 0) { + row_posn += large_bar_height; + } else { + row_posn += symbol->row_height[i]; + } + } + row_posn += yoffset; + + i = 0; + if(module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) { + addon_text_posn = row_posn * scaler; + addon_latch = 1; + } + if(latch == 1) { + /* a bar */ + if(addon_latch == 0) { + line = render_plot_create_line((i + xoffset) * scaler, (row_posn) * scaler, block_width * scaler, row_height * scaler); + } else { + line = render_plot_create_line((i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler); + } + latch = 0; + + render_plot_add_line(symbol, line, &last_line); + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + } + /* That's done the actual data area, everything else is human-friendly */ + + + /* Add the text */ + xoffset -= symbol_lead_in; + row_posn = (row_posn + large_bar_height) * scaler; + + if (!hide_text) { + if(upceanflag == 8) { + /* guard bar extensions and text formatting for EAN-8 */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch(i) { + case 0: + case 1: + case 10: + case 11: + case 20: + case 21: + line->length += (5.0 * scaler); + break; + } + i++; + } + + for(i = 0; i < 4; i++) { + textpart[i] = symbol->text[i]; + } + textpart[4] = '\0'; + textpos = 17; + textwidth = 4.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + for(i = 0; i < 4; i++) { + textpart[i] = symbol->text[i + 4]; + } + textpart[4] = '\0'; + textpos = 50; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = xoffset + 86; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 100; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + + } + + if(upceanflag == 13) { + /* guard bar extensions and text formatting for EAN-13 */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch(i) { + case 0: + case 1: + case 14: + case 15: + case 28: + case 29: + line->length += (5.0 * scaler); + break; + } + i++; + } + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = -5; // 7 + textwidth = 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 25; + textwidth = 6.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 7]; + } + textpart[6] = '\0'; + textpos = 72; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = xoffset + 114; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 128; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + } + + if (upceanflag == 12) { + /* guard bar extensions and text formatting for UPCA */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch(i) { + case 0: + case 1: + case 2: + case 3: + case 14: + case 15: + case 26: + case 27: + case 28: + case 29: + line->length += (5.0 * scaler); + break; + } + i++; + } + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = -5; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + for(i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[5] = '\0'; + textpos = 27; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + for(i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 6]; + } + textpos = 68; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textpart[0] = symbol->text[11]; + textpart[1] = '\0'; + textpos = 100; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = xoffset + 116; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 130; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + } + + if (upceanflag == 6) { + /* guard bar extensions and text formatting for UPCE */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch(i) { + case 0: + case 1: + case 14: + case 15: + case 16: + line->length += (5.0 * scaler); + break; + } + i++; + } + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = -5; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + for(i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 24; + textwidth = 6.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textpart[0] = symbol->text[7]; + textpart[1] = '\0'; + textpos = 55; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = xoffset + 70; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 84; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + } + + /* Put normal human readable text at the bottom (and centered) */ + if (textdone == 0) { + // caculate start xoffset to center text + render_plot_add_string(symbol, symbol->text, ((symbol->width / 2.0) + xoffset) * scaler, default_text_posn, 9.0 * scaler, 0.0, &last_string); + } + } + + switch(symbol->symbology) { + case BARCODE_MAXICODE: + /* Do nothing! */ + break; + default: + if((symbol->output_options & BARCODE_BIND) != 0) { + if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + for(r = 1; r < symbol->rows; r++) { + line = render_plot_create_line(xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler); + render_plot_add_line(symbol, line, &last_line); + } + } + } + if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + line = render_plot_create_line(0, 0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); + render_plot_add_line(symbol, line, &last_line); + line = render_plot_create_line(0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); + render_plot_add_line(symbol, line, &last_line); + } + if((symbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + line = render_plot_create_line(0, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); + render_plot_add_line(symbol, line, &last_line); + line = render_plot_create_line((symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); + render_plot_add_line(symbol, line, &last_line); + } + break; + } + + if (locale) + setlocale(LC_ALL, locale); + + return 1; +} + + +/* + * Create a new line with its memory allocated ready for adding to the + * rendered structure. + * + * This is much quicker than writing out each line manually (in some cases!) + */ +struct zint_render_line *render_plot_create_line(float x, float y, float width, float length) +{ + struct zint_render_line *line; + + line = (struct zint_render_line*)malloc(sizeof(struct zint_render_line)); + if (line) + { + line->next = NULL; + line->x = x; + line->y = y; + line->width = width; + line->length = length; + } + return line; +} + +/* + * Add the line to the current rendering and update the last line's + * next value. + */ +int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line) +{ + if (*last_line) + (*last_line)->next = line; + else + symbol->rendered->lines = line; // first line + + *last_line = line; + return 1; +} + +struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width) +{ + struct zint_render_ring *ring; + + ring = (struct zint_render_ring*)malloc(sizeof(struct zint_render_ring)); + if (ring) + { + ring->next = NULL; + ring->x = x; + ring->y = y; + ring->radius = radius; + ring->line_width = line_width; + } + return ring; +} + +int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring) +{ + if (*last_ring) + (*last_ring)->next = ring; + else + symbol->rendered->rings = ring; // first ring + + *last_ring = ring; + return 1; +} + +struct zint_render_hexagon *render_plot_create_hexagon(float x, float y) +{ + struct zint_render_hexagon *hexagon; + + hexagon = (struct zint_render_hexagon*)malloc(sizeof(struct zint_render_hexagon)); + if (hexagon) + { + hexagon->next = NULL; + hexagon->x = x; + hexagon->y = y; + } + return hexagon; +} + +int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *hexagon, struct zint_render_hexagon **last_hexagon) +{ + if (*last_hexagon) + (*last_hexagon)->next = hexagon; + else + symbol->rendered->hexagons = hexagon; // first hexagon + + *last_hexagon = hexagon; + return 1; +} + +/* + * Add a string structure to the symbol. + * Coordinates assumed to be from top-center. + */ +int render_plot_add_string(struct zint_symbol *symbol, + unsigned char *text, float x, float y, float fsize, float width, + struct zint_render_string **last_string) +{ + struct zint_render_string *string; + + string = (struct zint_render_string*)malloc(sizeof(struct zint_render_string)); + if (string) + { + string->next = NULL; + string->x = x; + string->y = y; + string->width = width; + string->fsize = fsize; + string->length = ustrlen(text); + string->text = (unsigned char*)malloc(sizeof(unsigned char) * (ustrlen(text) + 1)); + + if (string->text) + ustrcpy(string->text, text); + + if (*last_string) + (*last_string)->next = string; + else + symbol->rendered->strings = string; // First character + *last_string = string; + } + return 1; +} diff --git a/backend/sjis.h b/backend/sjis.h new file mode 100644 index 0000000..d5dd6e1 --- /dev/null +++ b/backend/sjis.h @@ -0,0 +1,6886 @@ +/* sjis.h - Unicode to Shift JIS lookup table + + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +/* Derived from : +## Shift_JIS (JIS X 0208:1997 Appendix 1) vs Unicode mapping table +## +## Date: 06 Mar 2002 06:01:22 GMT +## License: +## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. +## Copyright (C) 2001 I'O, All Rights Reserved. +## You can use, modify, distribute this table freely. +*/ + +unsigned long int sjis_lookup[] = { + 0x005C,0x815F, // REVERSE SOLIDUS + 0x00A2,0x8191, // CENT SIGN + 0x00A3,0x8192, // POUND SIGN + 0x00A7,0x8198, // SECTION SIGN + 0x00A8,0x814E, // DIAERESIS + 0x00AC,0x81CA, // NOT SIGN + 0x00B0,0x818B, // DEGREE SIGN + 0x00B1,0x817D, // PLUS-MINUS SIGN + 0x00B4,0x814C, // ACUTE ACCENT + 0x00B6,0x81F7, // PILCROW SIGN + 0x00D7,0x817E, // MULTIPLICATION SIGN + 0x00F7,0x8180, // DIVISION SIGN + 0x0391,0x839F, // GREEK CAPITAL LETTER ALPHA + 0x0392,0x83A0, // GREEK CAPITAL LETTER BETA + 0x0393,0x83A1, // GREEK CAPITAL LETTER GAMMA + 0x0394,0x83A2, // GREEK CAPITAL LETTER DELTA + 0x0395,0x83A3, // GREEK CAPITAL LETTER EPSILON + 0x0396,0x83A4, // GREEK CAPITAL LETTER ZETA + 0x0397,0x83A5, // GREEK CAPITAL LETTER ETA + 0x0398,0x83A6, // GREEK CAPITAL LETTER THETA + 0x0399,0x83A7, // GREEK CAPITAL LETTER IOTA + 0x039A,0x83A8, // GREEK CAPITAL LETTER KAPPA + 0x039B,0x83A9, // GREEK CAPITAL LETTER LAMDA + 0x039C,0x83AA, // GREEK CAPITAL LETTER MU + 0x039D,0x83AB, // GREEK CAPITAL LETTER NU + 0x039E,0x83AC, // GREEK CAPITAL LETTER XI + 0x039F,0x83AD, // GREEK CAPITAL LETTER OMICRON + 0x03A0,0x83AE, // GREEK CAPITAL LETTER PI + 0x03A1,0x83AF, // GREEK CAPITAL LETTER RHO + 0x03A3,0x83B0, // GREEK CAPITAL LETTER SIGMA + 0x03A4,0x83B1, // GREEK CAPITAL LETTER TAU + 0x03A5,0x83B2, // GREEK CAPITAL LETTER UPSILON + 0x03A6,0x83B3, // GREEK CAPITAL LETTER PHI + 0x03A7,0x83B4, // GREEK CAPITAL LETTER CHI + 0x03A8,0x83B5, // GREEK CAPITAL LETTER PSI + 0x03A9,0x83B6, // GREEK CAPITAL LETTER OMEGA + 0x03B1,0x83BF, // GREEK SMALL LETTER ALPHA + 0x03B2,0x83C0, // GREEK SMALL LETTER BETA + 0x03B3,0x83C1, // GREEK SMALL LETTER GAMMA + 0x03B4,0x83C2, // GREEK SMALL LETTER DELTA + 0x03B5,0x83C3, // GREEK SMALL LETTER EPSILON + 0x03B6,0x83C4, // GREEK SMALL LETTER ZETA + 0x03B7,0x83C5, // GREEK SMALL LETTER ETA + 0x03B8,0x83C6, // GREEK SMALL LETTER THETA + 0x03B9,0x83C7, // GREEK SMALL LETTER IOTA + 0x03BA,0x83C8, // GREEK SMALL LETTER KAPPA + 0x03BB,0x83C9, // GREEK SMALL LETTER LAMDA + 0x03BC,0x83CA, // GREEK SMALL LETTER MU + 0x03BD,0x83CB, // GREEK SMALL LETTER NU + 0x03BE,0x83CC, // GREEK SMALL LETTER XI + 0x03BF,0x83CD, // GREEK SMALL LETTER OMICRON + 0x03C0,0x83CE, // GREEK SMALL LETTER PI + 0x03C1,0x83CF, // GREEK SMALL LETTER RHO + 0x03C3,0x83D0, // GREEK SMALL LETTER SIGMA + 0x03C4,0x83D1, // GREEK SMALL LETTER TAU + 0x03C5,0x83D2, // GREEK SMALL LETTER UPSILON + 0x03C6,0x83D3, // GREEK SMALL LETTER PHI + 0x03C7,0x83D4, // GREEK SMALL LETTER CHI + 0x03C8,0x83D5, // GREEK SMALL LETTER PSI + 0x03C9,0x83D6, // GREEK SMALL LETTER OMEGA + 0x0401,0x8446, // CYRILLIC CAPITAL LETTER IO + 0x0410,0x8440, // CYRILLIC CAPITAL LETTER A + 0x0411,0x8441, // CYRILLIC CAPITAL LETTER BE + 0x0412,0x8442, // CYRILLIC CAPITAL LETTER VE + 0x0413,0x8443, // CYRILLIC CAPITAL LETTER GHE + 0x0414,0x8444, // CYRILLIC CAPITAL LETTER DE + 0x0415,0x8445, // CYRILLIC CAPITAL LETTER IE + 0x0416,0x8447, // CYRILLIC CAPITAL LETTER ZHE + 0x0417,0x8448, // CYRILLIC CAPITAL LETTER ZE + 0x0418,0x8449, // CYRILLIC CAPITAL LETTER I + 0x0419,0x844A, // CYRILLIC CAPITAL LETTER SHORT I + 0x041A,0x844B, // CYRILLIC CAPITAL LETTER KA + 0x041B,0x844C, // CYRILLIC CAPITAL LETTER EL + 0x041C,0x844D, // CYRILLIC CAPITAL LETTER EM + 0x041D,0x844E, // CYRILLIC CAPITAL LETTER EN + 0x041E,0x844F, // CYRILLIC CAPITAL LETTER O + 0x041F,0x8450, // CYRILLIC CAPITAL LETTER PE + 0x0420,0x8451, // CYRILLIC CAPITAL LETTER ER + 0x0421,0x8452, // CYRILLIC CAPITAL LETTER ES + 0x0422,0x8453, // CYRILLIC CAPITAL LETTER TE + 0x0423,0x8454, // CYRILLIC CAPITAL LETTER U + 0x0424,0x8455, // CYRILLIC CAPITAL LETTER EF + 0x0425,0x8456, // CYRILLIC CAPITAL LETTER HA + 0x0426,0x8457, // CYRILLIC CAPITAL LETTER TSE + 0x0427,0x8458, // CYRILLIC CAPITAL LETTER CHE + 0x0428,0x8459, // CYRILLIC CAPITAL LETTER SHA + 0x0429,0x845A, // CYRILLIC CAPITAL LETTER SHCHA + 0x042B,0x845C, // CYRILLIC CAPITAL LETTER YERU + 0x042C,0x845D, // CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D,0x845E, // CYRILLIC CAPITAL LETTER E + 0x042E,0x845F, // CYRILLIC CAPITAL LETTER YU + 0x042F,0x8460, // CYRILLIC CAPITAL LETTER YA + 0x0430,0x8470, // CYRILLIC SMALL LETTER A + 0x0431,0x8471, // CYRILLIC SMALL LETTER BE + 0x0432,0x8472, // CYRILLIC SMALL LETTER VE + 0x0433,0x8473, // CYRILLIC SMALL LETTER GHE + 0x0434,0x8474, // CYRILLIC SMALL LETTER DE + 0x0435,0x8475, // CYRILLIC SMALL LETTER IE + 0x0436,0x8477, // CYRILLIC SMALL LETTER ZHE + 0x0437,0x8478, // CYRILLIC SMALL LETTER ZE + 0x0438,0x8479, // CYRILLIC SMALL LETTER I + 0x0439,0x847A, // CYRILLIC SMALL LETTER SHORT I + 0x043A,0x847B, // CYRILLIC SMALL LETTER KA + 0x043B,0x847C, // CYRILLIC SMALL LETTER EL + 0x043C,0x847D, // CYRILLIC SMALL LETTER EM + 0x043D,0x847E, // CYRILLIC SMALL LETTER EN + 0x043E,0x8480, // CYRILLIC SMALL LETTER O + 0x043F,0x8481, // CYRILLIC SMALL LETTER PE + 0x0440,0x8482, // CYRILLIC SMALL LETTER ER + 0x0441,0x8483, // CYRILLIC SMALL LETTER ES + 0x0442,0x8484, // CYRILLIC SMALL LETTER TE + 0x0443,0x8485, // CYRILLIC SMALL LETTER U + 0x0444,0x8486, // CYRILLIC SMALL LETTER EF + 0x0445,0x8487, // CYRILLIC SMALL LETTER HA + 0x0446,0x8488, // CYRILLIC SMALL LETTER TSE + 0x0447,0x8489, // CYRILLIC SMALL LETTER CHE + 0x0448,0x848A, // CYRILLIC SMALL LETTER SHA + 0x0449,0x848B, // CYRILLIC SMALL LETTER SHCHA + 0x044A,0x848C, // CYRILLIC SMALL LETTER HARD SIGN + 0x044B,0x848D, // CYRILLIC SMALL LETTER YERU + 0x044C,0x848E, // CYRILLIC SMALL LETTER SOFT SIGN + 0x044D,0x848F, // CYRILLIC SMALL LETTER E + 0x044E,0x8490, // CYRILLIC SMALL LETTER YU + 0x044F,0x8491, // CYRILLIC SMALL LETTER YA + 0x0451,0x8476, // CYRILLIC SMALL LETTER IO + 0x2010,0x815D, // HYPHEN + 0x2014,0x815C, // EM DASH + 0x2016,0x8161, // DOUBLE VERTICAL LINE + 0x2018,0x8165, // LEFT SINGLE QUOTATION MARK + 0x2019,0x8166, // RIGHT SINGLE QUOTATION MARK + 0x201C,0x8167, // LEFT DOUBLE QUOTATION MARK + 0x201D,0x8168, // RIGHT DOUBLE QUOTATION MARK + 0x2020,0x81F5, // DAGGER + 0x2021,0x81F6, // DOUBLE DAGGER + 0x2025,0x8164, // TWO DOT LEADER + 0x2026,0x8163, // HORIZONTAL ELLIPSIS + 0x2030,0x81F1, // PER MILLE SIGN + 0x2032,0x818C, // PRIME + 0x2033,0x818D, // DOUBLE PRIME + 0x203B,0x81A6, // REFERENCE MARK + 0x2103,0x818E, // DEGREE CELSIUS + 0x212B,0x81F0, // ANGSTROM SIGN + 0x2190,0x81A9, // LEFTWARDS ARROW + 0x2191,0x81AA, // UPWARDS ARROW + 0x2192,0x81A8, // RIGHTWARDS ARROW + 0x2193,0x81AB, // DOWNWARDS ARROW + 0x21D2,0x81CB, // RIGHTWARDS DOUBLE ARROW + 0x21D4,0x81CC, // LEFT RIGHT DOUBLE ARROW + 0x2200,0x81CD, // FOR ALL + 0x2202,0x81DD, // PARTIAL DIFFERENTIAL + 0x2203,0x81CE, // THERE EXISTS + 0x2207,0x81DE, // NABLA + 0x2208,0x81B8, // ELEMENT OF + 0x220B,0x81B9, // CONTAINS AS MEMBER + 0x2212,0x817C, // MINUS SIGN + 0x221A,0x81E3, // SQUARE ROOT + 0x221D,0x81E5, // PROPORTIONAL TO + 0x221E,0x8187, // INFINITY + 0x2220,0x81DA, // ANGLE + 0x2227,0x81C8, // LOGICAL AND + 0x2228,0x81C9, // LOGICAL OR + 0x2229,0x81BF, // INTERSECTION + 0x222A,0x81BE, // UNION + 0x222B,0x81E7, // INTEGRAL + 0x222C,0x81E8, // DOUBLE INTEGRAL + 0x2234,0x8188, // THEREFORE + 0x2235,0x81E6, // BECAUSE + 0x223D,0x81E4, // REVERSED TILDE + 0x2252,0x81E0, // APPROXIMATELY EQUAL TO OR THE IMAGE OF + 0x2260,0x8182, // NOT EQUAL TO + 0x2261,0x81DF, // IDENTICAL TO + 0x2266,0x8185, // LESS-THAN OVER EQUAL TO + 0x2267,0x8186, // GREATER-THAN OVER EQUAL TO + 0x226A,0x81E1, // MUCH LESS-THAN + 0x226B,0x81E2, // MUCH GREATER-THAN + 0x2282,0x81BC, // SUBSET OF + 0x2283,0x81BD, // SUPERSET OF + 0x2286,0x81BA, // SUBSET OF OR EQUAL TO + 0x2287,0x81BB, // SUPERSET OF OR EQUAL TO + 0x22A5,0x81DB, // UP TACK + 0x2312,0x81DC, // ARC + 0x2500,0x849F, // BOX DRAWINGS LIGHT HORIZONTAL + 0x2501,0x84AA, // BOX DRAWINGS HEAVY HORIZONTAL + 0x2502,0x84A0, // BOX DRAWINGS LIGHT VERTICAL + 0x2503,0x84AB, // BOX DRAWINGS HEAVY VERTICAL + 0x250C,0x84A1, // BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x250F,0x84AC, // BOX DRAWINGS HEAVY DOWN AND RIGHT + 0x2510,0x84A2, // BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2513,0x84AD, // BOX DRAWINGS HEAVY DOWN AND LEFT + 0x2514,0x84A4, // BOX DRAWINGS LIGHT UP AND RIGHT + 0x2517,0x84AF, // BOX DRAWINGS HEAVY UP AND RIGHT + 0x2518,0x84A3, // BOX DRAWINGS LIGHT UP AND LEFT + 0x251B,0x84AE, // BOX DRAWINGS HEAVY UP AND LEFT + 0x251C,0x84A5, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x251D,0x84BA, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + 0x2520,0x84B5, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + 0x2523,0x84B0, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT + 0x2524,0x84A7, // BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x2525,0x84BC, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + 0x2528,0x84B7, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + 0x252B,0x84B2, // BOX DRAWINGS HEAVY VERTICAL AND LEFT + 0x252C,0x84A6, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x252F,0x84B6, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + 0x2530,0x84BB, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + 0x2533,0x84B1, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + 0x2534,0x84A8, // BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x2537,0x84B8, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + 0x2538,0x84BD, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + 0x253B,0x84B3, // BOX DRAWINGS HEAVY UP AND HORIZONTAL + 0x253C,0x84A9, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x253F,0x84B9, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + 0x2542,0x84BE, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + 0x254B,0x84B4, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + 0x25A0,0x81A1, // BLACK SQUARE + 0x25A1,0x81A0, // WHITE SQUARE + 0x25B2,0x81A3, // BLACK UP-POINTING TRIANGLE + 0x25B3,0x81A2, // WHITE UP-POINTING TRIANGLE + 0x25BC,0x81A5, // BLACK DOWN-POINTING TRIANGLE + 0x25BD,0x81A4, // WHITE DOWN-POINTING TRIANGLE + 0x25C6,0x819F, // BLACK DIAMOND + 0x25C7,0x819E, // WHITE DIAMOND + 0x25CB,0x819B, // WHITE CIRCLE + 0x25CE,0x819D, // BULLSEYE + 0x25CF,0x819C, // BLACK CIRCLE + 0x25EF,0x81FC, // LARGE CIRCLE + 0x2605,0x819A, // BLACK STAR + 0x2606,0x8199, // WHITE STAR + 0x2640,0x818A, // FEMALE SIGN + 0x2642,0x8189, // MALE SIGN + 0x266A,0x81F4, // EIGHTH NOTE + 0x266D,0x81F3, // MUSIC FLAT SIGN + 0x266F,0x81F2, // MUSIC SHARP SIGN + 0x3000,0x8140, // IDEOGRAPHIC SPACE + 0x3001,0x8141, // IDEOGRAPHIC COMMA + 0x3002,0x8142, // IDEOGRAPHIC FULL STOP + 0x3003,0x8156, // DITTO MARK + 0x3005,0x8158, // IDEOGRAPHIC ITERATION MARK + 0x3006,0x8159, // IDEOGRAPHIC CLOSING MARK + 0x3007,0x815A, // IDEOGRAPHIC NUMBER ZERO + 0x3008,0x8171, // LEFT ANGLE BRACKET + 0x3009,0x8172, // RIGHT ANGLE BRACKET + 0x300A,0x8173, // LEFT DOUBLE ANGLE BRACKET + 0x300B,0x8174, // RIGHT DOUBLE ANGLE BRACKET + 0x300C,0x8175, // LEFT CORNER BRACKET + 0x300D,0x8176, // RIGHT CORNER BRACKET + 0x300E,0x8177, // LEFT WHITE CORNER BRACKET + 0x300F,0x8178, // RIGHT WHITE CORNER BRACKET + 0x3010,0x8179, // LEFT BLACK LENTICULAR BRACKET + 0x3011,0x817A, // RIGHT BLACK LENTICULAR BRACKET + 0x3012,0x81A7, // POSTAL MARK + 0x3013,0x81AC, // GETA MARK + 0x3014,0x816B, // LEFT TORTOISE SHELL BRACKET + 0x3015,0x816C, // RIGHT TORTOISE SHELL BRACKET + 0x301C,0x8160, // WAVE DASH + 0x3041,0x829F, // HIRAGANA LETTER SMALL A + 0x3042,0x82A0, // HIRAGANA LETTER A + 0x3043,0x82A1, // HIRAGANA LETTER SMALL I + 0x3044,0x82A2, // HIRAGANA LETTER I + 0x3045,0x82A3, // HIRAGANA LETTER SMALL U + 0x3046,0x82A4, // HIRAGANA LETTER U + 0x3047,0x82A5, // HIRAGANA LETTER SMALL E + 0x3048,0x82A6, // HIRAGANA LETTER E + 0x3049,0x82A7, // HIRAGANA LETTER SMALL O + 0x304A,0x82A8, // HIRAGANA LETTER O + 0x304B,0x82A9, // HIRAGANA LETTER KA + 0x304C,0x82AA, // HIRAGANA LETTER GA + 0x304D,0x82AB, // HIRAGANA LETTER KI + 0x304E,0x82AC, // HIRAGANA LETTER GI + 0x304F,0x82AD, // HIRAGANA LETTER KU + 0x3050,0x82AE, // HIRAGANA LETTER GU + 0x3051,0x82AF, // HIRAGANA LETTER KE + 0x3052,0x82B0, // HIRAGANA LETTER GE + 0x3053,0x82B1, // HIRAGANA LETTER KO + 0x3054,0x82B2, // HIRAGANA LETTER GO + 0x3055,0x82B3, // HIRAGANA LETTER SA + 0x3056,0x82B4, // HIRAGANA LETTER ZA + 0x3057,0x82B5, // HIRAGANA LETTER SI + 0x3058,0x82B6, // HIRAGANA LETTER ZI + 0x3059,0x82B7, // HIRAGANA LETTER SU + 0x305A,0x82B8, // HIRAGANA LETTER ZU + 0x305B,0x82B9, // HIRAGANA LETTER SE + 0x305C,0x82BA, // HIRAGANA LETTER ZE + 0x305D,0x82BB, // HIRAGANA LETTER SO + 0x305E,0x82BC, // HIRAGANA LETTER ZO + 0x305F,0x82BD, // HIRAGANA LETTER TA + 0x3060,0x82BE, // HIRAGANA LETTER DA + 0x3061,0x82BF, // HIRAGANA LETTER TI + 0x3062,0x82C0, // HIRAGANA LETTER DI + 0x3063,0x82C1, // HIRAGANA LETTER SMALL TU + 0x3064,0x82C2, // HIRAGANA LETTER TU + 0x3065,0x82C3, // HIRAGANA LETTER DU + 0x3066,0x82C4, // HIRAGANA LETTER TE + 0x3067,0x82C5, // HIRAGANA LETTER DE + 0x3068,0x82C6, // HIRAGANA LETTER TO + 0x3069,0x82C7, // HIRAGANA LETTER DO + 0x306A,0x82C8, // HIRAGANA LETTER NA + 0x306B,0x82C9, // HIRAGANA LETTER NI + 0x306C,0x82CA, // HIRAGANA LETTER NU + 0x306D,0x82CB, // HIRAGANA LETTER NE + 0x306E,0x82CC, // HIRAGANA LETTER NO + 0x306F,0x82CD, // HIRAGANA LETTER HA + 0x3070,0x82CE, // HIRAGANA LETTER BA + 0x3071,0x82CF, // HIRAGANA LETTER PA + 0x3072,0x82D0, // HIRAGANA LETTER HI + 0x3073,0x82D1, // HIRAGANA LETTER BI + 0x3074,0x82D2, // HIRAGANA LETTER PI + 0x3075,0x82D3, // HIRAGANA LETTER HU + 0x3076,0x82D4, // HIRAGANA LETTER BU + 0x3077,0x82D5, // HIRAGANA LETTER PU + 0x3078,0x82D6, // HIRAGANA LETTER HE + 0x3079,0x82D7, // HIRAGANA LETTER BE + 0x307A,0x82D8, // HIRAGANA LETTER PE + 0x307B,0x82D9, // HIRAGANA LETTER HO + 0x307C,0x82DA, // HIRAGANA LETTER BO + 0x307D,0x82DB, // HIRAGANA LETTER PO + 0x307E,0x82DC, // HIRAGANA LETTER MA + 0x307F,0x82DD, // HIRAGANA LETTER MI + 0x3080,0x82DE, // HIRAGANA LETTER MU + 0x3081,0x82DF, // HIRAGANA LETTER ME + 0x3082,0x82E0, // HIRAGANA LETTER MO + 0x3083,0x82E1, // HIRAGANA LETTER SMALL YA + 0x3084,0x82E2, // HIRAGANA LETTER YA + 0x3085,0x82E3, // HIRAGANA LETTER SMALL YU + 0x3086,0x82E4, // HIRAGANA LETTER YU + 0x3087,0x82E5, // HIRAGANA LETTER SMALL YO + 0x3088,0x82E6, // HIRAGANA LETTER YO + 0x3089,0x82E7, // HIRAGANA LETTER RA + 0x308A,0x82E8, // HIRAGANA LETTER RI + 0x308B,0x82E9, // HIRAGANA LETTER RU + 0x308C,0x82EA, // HIRAGANA LETTER RE + 0x308D,0x82EB, // HIRAGANA LETTER RO + 0x308E,0x82EC, // HIRAGANA LETTER SMALL WA + 0x308F,0x82ED, // HIRAGANA LETTER WA + 0x3090,0x82EE, // HIRAGANA LETTER WI + 0x3091,0x82EF, // HIRAGANA LETTER WE + 0x3092,0x82F0, // HIRAGANA LETTER WO + 0x3093,0x82F1, // HIRAGANA LETTER N + 0x309B,0x814A, // KATAKANA-HIRAGANA VOICED SOUND MARK + 0x309C,0x814B, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 0x309D,0x8154, // HIRAGANA ITERATION MARK + 0x309E,0x8155, // HIRAGANA VOICED ITERATION MARK + 0x30A1,0x8340, // KATAKANA LETTER SMALL A + 0x30A2,0x8341, // KATAKANA LETTER A + 0x30A3,0x8342, // KATAKANA LETTER SMALL I + 0x30A4,0x8343, // KATAKANA LETTER I + 0x30A5,0x8344, // KATAKANA LETTER SMALL U + 0x30A6,0x8345, // KATAKANA LETTER U + 0x30A7,0x8346, // KATAKANA LETTER SMALL E + 0x30A8,0x8347, // KATAKANA LETTER E + 0x30A9,0x8348, // KATAKANA LETTER SMALL O + 0x30AA,0x8349, // KATAKANA LETTER O + 0x30AB,0x834A, // KATAKANA LETTER KA + 0x30AC,0x834B, // KATAKANA LETTER GA + 0x30AD,0x834C, // KATAKANA LETTER KI + 0x30AE,0x834D, // KATAKANA LETTER GI + 0x30AF,0x834E, // KATAKANA LETTER KU + 0x30B0,0x834F, // KATAKANA LETTER GU + 0x30B1,0x8350, // KATAKANA LETTER KE + 0x30B2,0x8351, // KATAKANA LETTER GE + 0x30B3,0x8352, // KATAKANA LETTER KO + 0x30B4,0x8353, // KATAKANA LETTER GO + 0x30B5,0x8354, // KATAKANA LETTER SA + 0x30B6,0x8355, // KATAKANA LETTER ZA + 0x30B7,0x8356, // KATAKANA LETTER SI + 0x30B8,0x8357, // KATAKANA LETTER ZI + 0x30B9,0x8358, // KATAKANA LETTER SU + 0x30BA,0x8359, // KATAKANA LETTER ZU + 0x30BB,0x835A, // KATAKANA LETTER SE + 0x30BD,0x835C, // KATAKANA LETTER SO + 0x30BE,0x835D, // KATAKANA LETTER ZO + 0x30BF,0x835E, // KATAKANA LETTER TA + 0x30C0,0x835F, // KATAKANA LETTER DA + 0x30C1,0x8360, // KATAKANA LETTER TI + 0x30C2,0x8361, // KATAKANA LETTER DI + 0x30C3,0x8362, // KATAKANA LETTER SMALL TU + 0x30C4,0x8363, // KATAKANA LETTER TU + 0x30C5,0x8364, // KATAKANA LETTER DU + 0x30C6,0x8365, // KATAKANA LETTER TE + 0x30C7,0x8366, // KATAKANA LETTER DE + 0x30C8,0x8367, // KATAKANA LETTER TO + 0x30C9,0x8368, // KATAKANA LETTER DO + 0x30CA,0x8369, // KATAKANA LETTER NA + 0x30CB,0x836A, // KATAKANA LETTER NI + 0x30CC,0x836B, // KATAKANA LETTER NU + 0x30CD,0x836C, // KATAKANA LETTER NE + 0x30CE,0x836D, // KATAKANA LETTER NO + 0x30CF,0x836E, // KATAKANA LETTER HA + 0x30D0,0x836F, // KATAKANA LETTER BA + 0x30D1,0x8370, // KATAKANA LETTER PA + 0x30D2,0x8371, // KATAKANA LETTER HI + 0x30D3,0x8372, // KATAKANA LETTER BI + 0x30D4,0x8373, // KATAKANA LETTER PI + 0x30D5,0x8374, // KATAKANA LETTER HU + 0x30D6,0x8375, // KATAKANA LETTER BU + 0x30D7,0x8376, // KATAKANA LETTER PU + 0x30D8,0x8377, // KATAKANA LETTER HE + 0x30D9,0x8378, // KATAKANA LETTER BE + 0x30DA,0x8379, // KATAKANA LETTER PE + 0x30DB,0x837A, // KATAKANA LETTER HO + 0x30DC,0x837B, // KATAKANA LETTER BO + 0x30DD,0x837C, // KATAKANA LETTER PO + 0x30DE,0x837D, // KATAKANA LETTER MA + 0x30DF,0x837E, // KATAKANA LETTER MI + 0x30E0,0x8380, // KATAKANA LETTER MU + 0x30E1,0x8381, // KATAKANA LETTER ME + 0x30E2,0x8382, // KATAKANA LETTER MO + 0x30E3,0x8383, // KATAKANA LETTER SMALL YA + 0x30E4,0x8384, // KATAKANA LETTER YA + 0x30E5,0x8385, // KATAKANA LETTER SMALL YU + 0x30E6,0x8386, // KATAKANA LETTER YU + 0x30E7,0x8387, // KATAKANA LETTER SMALL YO + 0x30E8,0x8388, // KATAKANA LETTER YO + 0x30E9,0x8389, // KATAKANA LETTER RA + 0x30EA,0x838A, // KATAKANA LETTER RI + 0x30EB,0x838B, // KATAKANA LETTER RU + 0x30EC,0x838C, // KATAKANA LETTER RE + 0x30ED,0x838D, // KATAKANA LETTER RO + 0x30EE,0x838E, // KATAKANA LETTER SMALL WA + 0x30EF,0x838F, // KATAKANA LETTER WA + 0x30F0,0x8390, // KATAKANA LETTER WI + 0x30F1,0x8391, // KATAKANA LETTER WE + 0x30F2,0x8392, // KATAKANA LETTER WO + 0x30F3,0x8393, // KATAKANA LETTER N + 0x30F4,0x8394, // KATAKANA LETTER VU + 0x30F5,0x8395, // KATAKANA LETTER SMALL KA + 0x30F6,0x8396, // KATAKANA LETTER SMALL KE + 0x30FB,0x8145, // KATAKANA MIDDLE DOT + 0x30FD,0x8152, // KATAKANA ITERATION MARK + 0x30FE,0x8153, // KATAKANA VOICED ITERATION MARK + 0x4E00,0x88EA, // <cjk> + 0x4E01,0x929A, // <cjk> + 0x4E03,0x8EB5, // <cjk> + 0x4E07,0x969C, // <cjk> + 0x4E08,0x8FE4, // <cjk> + 0x4E09,0x8E4F, // <cjk> + 0x4E0A,0x8FE3, // <cjk> + 0x4E0B,0x89BA, // <cjk> + 0x4E0D,0x9573, // <cjk> + 0x4E0E,0x975E, // <cjk> + 0x4E10,0x98A0, // <cjk> + 0x4E11,0x894E, // <cjk> + 0x4E14,0x8A8E, // <cjk> + 0x4E15,0x98A1, // <cjk> + 0x4E16,0x90A2, // <cjk> + 0x4E17,0x99C0, // <cjk> + 0x4E18,0x8B75, // <cjk> + 0x4E19,0x95B8, // <cjk> + 0x4E1E,0x8FE5, // <cjk> + 0x4E21,0x97BC, // <cjk> + 0x4E26,0x95C0, // <cjk> + 0x4E2A,0x98A2, // <cjk> + 0x4E2D,0x9286, // <cjk> + 0x4E31,0x98A3, // <cjk> + 0x4E32,0x8BF8, // <cjk> + 0x4E36,0x98A4, // <cjk> + 0x4E38,0x8ADB, // <cjk> + 0x4E39,0x924F, // <cjk> + 0x4E3B,0x8EE5, // <cjk> + 0x4E3C,0x98A5, // <cjk> + 0x4E3F,0x98A6, // <cjk> + 0x4E42,0x98A7, // <cjk> + 0x4E43,0x9454, // <cjk> + 0x4E45,0x8B76, // <cjk> + 0x4E4B,0x9456, // <cjk> + 0x4E4D,0x93E1, // <cjk> + 0x4E4E,0x8CC1, // <cjk> + 0x4E4F,0x9652, // <cjk> + 0x4E55,0xE568, // <cjk> + 0x4E56,0x98A8, // <cjk> + 0x4E57,0x8FE6, // <cjk> + 0x4E58,0x98A9, // <cjk> + 0x4E59,0x89B3, // <cjk> + 0x4E5D,0x8BE3, // <cjk> + 0x4E5E,0x8CEE, // <cjk> + 0x4E5F,0x96E7, // <cjk> + 0x4E62,0x9BA4, // <cjk> + 0x4E71,0x9790, // <cjk> + 0x4E73,0x93FB, // <cjk> + 0x4E7E,0x8AA3, // <cjk> + 0x4E80,0x8B54, // <cjk> + 0x4E82,0x98AA, // <cjk> + 0x4E85,0x98AB, // <cjk> + 0x4E86,0x97B9, // <cjk> + 0x4E88,0x975C, // <cjk> + 0x4E89,0x9188, // <cjk> + 0x4E8A,0x98AD, // <cjk> + 0x4E8B,0x8E96, // <cjk> + 0x4E8C,0x93F1, // <cjk> + 0x4E8E,0x98B0, // <cjk> + 0x4E91,0x895D, // <cjk> + 0x4E92,0x8CDD, // <cjk> + 0x4E94,0x8CDC, // <cjk> + 0x4E95,0x88E4, // <cjk> + 0x4E98,0x986A, // <cjk> + 0x4E99,0x9869, // <cjk> + 0x4E9B,0x8DB1, // <cjk> + 0x4E9C,0x889F, // <cjk> + 0x4E9E,0x98B1, // <cjk> + 0x4E9F,0x98B2, // <cjk> + 0x4EA0,0x98B3, // <cjk> + 0x4EA1,0x9653, // <cjk> + 0x4EA2,0x98B4, // <cjk> + 0x4EA4,0x8CF0, // <cjk> + 0x4EA5,0x88E5, // <cjk> + 0x4EA6,0x9692, // <cjk> + 0x4EA8,0x8B9C, // <cjk> + 0x4EAB,0x8B9D, // <cjk> + 0x4EAC,0x8B9E, // <cjk> + 0x4EAD,0x92E0, // <cjk> + 0x4EAE,0x97BA, // <cjk> + 0x4EB0,0x98B5, // <cjk> + 0x4EB3,0x98B6, // <cjk> + 0x4EB6,0x98B7, // <cjk> + 0x4EBA,0x906C, // <cjk> + 0x4EC0,0x8F59, // <cjk> + 0x4EC1,0x906D, // <cjk> + 0x4EC2,0x98BC, // <cjk> + 0x4EC4,0x98BA, // <cjk> + 0x4EC6,0x98BB, // <cjk> + 0x4EC7,0x8B77, // <cjk> + 0x4ECA,0x8DA1, // <cjk> + 0x4ECB,0x89EE, // <cjk> + 0x4ECD,0x98B9, // <cjk> + 0x4ECE,0x98B8, // <cjk> + 0x4ECF,0x95A7, // <cjk> + 0x4ED4,0x8E65, // <cjk> + 0x4ED5,0x8E64, // <cjk> + 0x4ED6,0x91BC, // <cjk> + 0x4ED7,0x98BD, // <cjk> + 0x4ED8,0x9574, // <cjk> + 0x4ED9,0x90E5, // <cjk> + 0x4EDD,0x8157, // <cjk> + 0x4EDE,0x98BE, // <cjk> + 0x4EDF,0x98C0, // <cjk> + 0x4EE3,0x91E3, // <cjk> + 0x4EE4,0x97DF, // <cjk> + 0x4EE5,0x88C8, // <cjk> + 0x4EED,0x98BF, // <cjk> + 0x4EEE,0x89BC, // <cjk> + 0x4EF0,0x8BC2, // <cjk> + 0x4EF2,0x9287, // <cjk> + 0x4EF6,0x8C8F, // <cjk> + 0x4EF7,0x98C1, // <cjk> + 0x4EFB,0x9443, // <cjk> + 0x4F01,0x8AE9, // <cjk> + 0x4F09,0x98C2, // <cjk> + 0x4F0A,0x88C9, // <cjk> + 0x4F0D,0x8CDE, // <cjk> + 0x4F0E,0x8AEA, // <cjk> + 0x4F0F,0x959A, // <cjk> + 0x4F10,0x94B0, // <cjk> + 0x4F11,0x8B78, // <cjk> + 0x4F1A,0x89EF, // <cjk> + 0x4F1C,0x98E5, // <cjk> + 0x4F1D,0x9360, // <cjk> + 0x4F2F,0x948C, // <cjk> + 0x4F30,0x98C4, // <cjk> + 0x4F34,0x94BA, // <cjk> + 0x4F36,0x97E0, // <cjk> + 0x4F38,0x904C, // <cjk> + 0x4F3A,0x8E66, // <cjk> + 0x4F3C,0x8E97, // <cjk> + 0x4F3D,0x89BE, // <cjk> + 0x4F43,0x92CF, // <cjk> + 0x4F46,0x9241, // <cjk> + 0x4F47,0x98C8, // <cjk> + 0x4F4D,0x88CA, // <cjk> + 0x4F4E,0x92E1, // <cjk> + 0x4F4F,0x8F5A, // <cjk> + 0x4F50,0x8DB2, // <cjk> + 0x4F51,0x9743, // <cjk> + 0x4F53,0x91CC, // <cjk> + 0x4F55,0x89BD, // <cjk> + 0x4F57,0x98C7, // <cjk> + 0x4F59,0x975D, // <cjk> + 0x4F5A,0x98C3, // <cjk> + 0x4F5B,0x98C5, // <cjk> + 0x4F5C,0x8DEC, // <cjk> + 0x4F5D,0x98C6, // <cjk> + 0x4F5E,0x9B43, // <cjk> + 0x4F69,0x98CE, // <cjk> + 0x4F6F,0x98D1, // <cjk> + 0x4F70,0x98CF, // <cjk> + 0x4F73,0x89C0, // <cjk> + 0x4F75,0x95B9, // <cjk> + 0x4F76,0x98C9, // <cjk> + 0x4F7B,0x98CD, // <cjk> + 0x4F7C,0x8CF1, // <cjk> + 0x4F7F,0x8E67, // <cjk> + 0x4F83,0x8AA4, // <cjk> + 0x4F86,0x98D2, // <cjk> + 0x4F88,0x98CA, // <cjk> + 0x4F8B,0x97E1, // <cjk> + 0x4F8D,0x8E98, // <cjk> + 0x4F8F,0x98CB, // <cjk> + 0x4F91,0x98D0, // <cjk> + 0x4F96,0x98D3, // <cjk> + 0x4F98,0x98CC, // <cjk> + 0x4F9B,0x8B9F, // <cjk> + 0x4F9D,0x88CB, // <cjk> + 0x4FA0,0x8BA0, // <cjk> + 0x4FA1,0x89BF, // <cjk> + 0x4FAB,0x9B44, // <cjk> + 0x4FAD,0x9699, // <cjk> + 0x4FAE,0x958E, // <cjk> + 0x4FAF,0x8CF2, // <cjk> + 0x4FB5,0x904E, // <cjk> + 0x4FB6,0x97B5, // <cjk> + 0x4FBF,0x95D6, // <cjk> + 0x4FC2,0x8C57, // <cjk> + 0x4FC3,0x91A3, // <cjk> + 0x4FC4,0x89E2, // <cjk> + 0x4FCA,0x8F72, // <cjk> + 0x4FCE,0x98D7, // <cjk> + 0x4FD0,0x98DC, // <cjk> + 0x4FD1,0x98DA, // <cjk> + 0x4FD4,0x98D5, // <cjk> + 0x4FD7,0x91AD, // <cjk> + 0x4FD8,0x98D8, // <cjk> + 0x4FDA,0x98DB, // <cjk> + 0x4FDB,0x98D9, // <cjk> + 0x4FDD,0x95DB, // <cjk> + 0x4FDF,0x98D6, // <cjk> + 0x4FE1,0x904D, // <cjk> + 0x4FE3,0x9693, // <cjk> + 0x4FE4,0x98DD, // <cjk> + 0x4FE5,0x98DE, // <cjk> + 0x4FEE,0x8F43, // <cjk> + 0x4FEF,0x98EB, // <cjk> + 0x4FF3,0x946F, // <cjk> + 0x4FF5,0x9555, // <cjk> + 0x4FF6,0x98E6, // <cjk> + 0x4FF8,0x95EE, // <cjk> + 0x4FFA,0x89B4, // <cjk> + 0x4FFE,0x98EA, // <cjk> + 0x5005,0x98E4, // <cjk> + 0x5006,0x98ED, // <cjk> + 0x5009,0x9171, // <cjk> + 0x500B,0x8CC2, // <cjk> + 0x500D,0x947B, // <cjk> + 0x500F,0xE0C5, // <cjk> + 0x5011,0x98EC, // <cjk> + 0x5012,0x937C, // <cjk> + 0x5014,0x98E1, // <cjk> + 0x5016,0x8CF4, // <cjk> + 0x5019,0x8CF3, // <cjk> + 0x501A,0x98DF, // <cjk> + 0x501F,0x8ED8, // <cjk> + 0x5021,0x98E7, // <cjk> + 0x5023,0x95ED, // <cjk> + 0x5024,0x926C, // <cjk> + 0x5025,0x98E3, // <cjk> + 0x5026,0x8C91, // <cjk> + 0x5028,0x98E0, // <cjk> + 0x5029,0x98E8, // <cjk> + 0x502A,0x98E2, // <cjk> + 0x502B,0x97CF, // <cjk> + 0x502C,0x98E9, // <cjk> + 0x502D,0x9860, // <cjk> + 0x5036,0x8BE4, // <cjk> + 0x5039,0x8C90, // <cjk> + 0x5043,0x98EE, // <cjk> + 0x5047,0x98EF, // <cjk> + 0x5048,0x98F3, // <cjk> + 0x5049,0x88CC, // <cjk> + 0x504F,0x95CE, // <cjk> + 0x5050,0x98F2, // <cjk> + 0x5055,0x98F1, // <cjk> + 0x5056,0x98F5, // <cjk> + 0x505A,0x98F4, // <cjk> + 0x505C,0x92E2, // <cjk> + 0x5065,0x8C92, // <cjk> + 0x506C,0x98F6, // <cjk> + 0x5072,0x8EC3, // <cjk> + 0x5074,0x91A4, // <cjk> + 0x5075,0x92E3, // <cjk> + 0x5076,0x8BF4, // <cjk> + 0x5078,0x98F7, // <cjk> + 0x507D,0x8B55, // <cjk> + 0x5080,0x98F8, // <cjk> + 0x5085,0x98FA, // <cjk> + 0x508D,0x9654, // <cjk> + 0x5091,0x8C86, // <cjk> + 0x5098,0x8E50, // <cjk> + 0x5099,0x94F5, // <cjk> + 0x509A,0x98F9, // <cjk> + 0x50AC,0x8DC3, // <cjk> + 0x50AD,0x9762, // <cjk> + 0x50B2,0x98FC, // <cjk> + 0x50B3,0x9942, // <cjk> + 0x50B4,0x98FB, // <cjk> + 0x50B5,0x8DC2, // <cjk> + 0x50B7,0x8F9D, // <cjk> + 0x50BE,0x8C58, // <cjk> + 0x50C2,0x9943, // <cjk> + 0x50C5,0x8BCD, // <cjk> + 0x50C9,0x9940, // <cjk> + 0x50CA,0x9941, // <cjk> + 0x50CD,0x93AD, // <cjk> + 0x50CF,0x919C, // <cjk> + 0x50D1,0x8BA1, // <cjk> + 0x50D5,0x966C, // <cjk> + 0x50D6,0x9944, // <cjk> + 0x50DA,0x97BB, // <cjk> + 0x50DE,0x9945, // <cjk> + 0x50E3,0x9948, // <cjk> + 0x50E5,0x9946, // <cjk> + 0x50E7,0x916D, // <cjk> + 0x50ED,0x9947, // <cjk> + 0x50EE,0x9949, // <cjk> + 0x50F5,0x994B, // <cjk> + 0x50F9,0x994A, // <cjk> + 0x50FB,0x95C6, // <cjk> + 0x5100,0x8B56, // <cjk> + 0x5101,0x994D, // <cjk> + 0x5102,0x994E, // <cjk> + 0x5104,0x89AD, // <cjk> + 0x5109,0x994C, // <cjk> + 0x5112,0x8EF2, // <cjk> + 0x5114,0x9951, // <cjk> + 0x5115,0x9950, // <cjk> + 0x5116,0x994F, // <cjk> + 0x5118,0x98D4, // <cjk> + 0x511A,0x9952, // <cjk> + 0x511F,0x8F9E, // <cjk> + 0x5121,0x9953, // <cjk> + 0x512A,0x9744, // <cjk> + 0x5132,0x96D7, // <cjk> + 0x5137,0x9955, // <cjk> + 0x513A,0x9954, // <cjk> + 0x513B,0x9957, // <cjk> + 0x513C,0x9956, // <cjk> + 0x513F,0x9958, // <cjk> + 0x5140,0x9959, // <cjk> + 0x5141,0x88F2, // <cjk> + 0x5143,0x8CB3, // <cjk> + 0x5144,0x8C5A, // <cjk> + 0x5146,0x929B, // <cjk> + 0x5147,0x8BA2, // <cjk> + 0x5148,0x90E6, // <cjk> + 0x5149,0x8CF5, // <cjk> + 0x514B,0x8D8E, // <cjk> + 0x514D,0x96C6, // <cjk> + 0x514E,0x9365, // <cjk> + 0x5150,0x8E99, // <cjk> + 0x5152,0x995A, // <cjk> + 0x5154,0x995C, // <cjk> + 0x515A,0x937D, // <cjk> + 0x515C,0x8A95, // <cjk> + 0x5162,0x995D, // <cjk> + 0x5165,0x93FC, // <cjk> + 0x5168,0x9153, // <cjk> + 0x5169,0x995F, // <cjk> + 0x516A,0x9960, // <cjk> + 0x516B,0x94AA, // <cjk> + 0x516C,0x8CF6, // <cjk> + 0x516D,0x985A, // <cjk> + 0x516E,0x9961, // <cjk> + 0x5171,0x8BA4, // <cjk> + 0x5175,0x95BA, // <cjk> + 0x5176,0x91B4, // <cjk> + 0x5177,0x8BEF, // <cjk> + 0x5178,0x9354, // <cjk> + 0x517C,0x8C93, // <cjk> + 0x5180,0x9962, // <cjk> + 0x5182,0x9963, // <cjk> + 0x5185,0x93E0, // <cjk> + 0x5186,0x897E, // <cjk> + 0x5189,0x9966, // <cjk> + 0x518A,0x8DFB, // <cjk> + 0x518C,0x9965, // <cjk> + 0x518D,0x8DC4, // <cjk> + 0x518F,0x9967, // <cjk> + 0x5190,0xE3EC, // <cjk> + 0x5191,0x9968, // <cjk> + 0x5192,0x9660, // <cjk> + 0x5193,0x9969, // <cjk> + 0x5195,0x996A, // <cjk> + 0x5196,0x996B, // <cjk> + 0x5197,0x8FE7, // <cjk> + 0x5199,0x8ECA, // <cjk> + 0x51A0,0x8AA5, // <cjk> + 0x51A2,0x996E, // <cjk> + 0x51A4,0x996C, // <cjk> + 0x51A5,0x96BB, // <cjk> + 0x51A6,0x996D, // <cjk> + 0x51A8,0x9579, // <cjk> + 0x51A9,0x996F, // <cjk> + 0x51AA,0x9970, // <cjk> + 0x51AB,0x9971, // <cjk> + 0x51AC,0x937E, // <cjk> + 0x51B0,0x9975, // <cjk> + 0x51B1,0x9973, // <cjk> + 0x51B2,0x9974, // <cjk> + 0x51B3,0x9972, // <cjk> + 0x51B4,0x8DE1, // <cjk> + 0x51B5,0x9976, // <cjk> + 0x51B6,0x96E8, // <cjk> + 0x51B7,0x97E2, // <cjk> + 0x51BD,0x9977, // <cjk> + 0x51C4,0x90A6, // <cjk> + 0x51C5,0x9978, // <cjk> + 0x51C6,0x8F79, // <cjk> + 0x51C9,0x9979, // <cjk> + 0x51CB,0x929C, // <cjk> + 0x51CC,0x97BD, // <cjk> + 0x51CD,0x9380, // <cjk> + 0x51D6,0x99C3, // <cjk> + 0x51DB,0x997A, // <cjk> + 0x51DC,0xEAA3, // <cjk> + 0x51DD,0x8BC3, // <cjk> + 0x51E0,0x997B, // <cjk> + 0x51E1,0x967D, // <cjk> + 0x51E6,0x8F88, // <cjk> + 0x51E7,0x91FA, // <cjk> + 0x51E9,0x997D, // <cjk> + 0x51EA,0x93E2, // <cjk> + 0x51ED,0x997E, // <cjk> + 0x51F0,0x9980, // <cjk> + 0x51F1,0x8A4D, // <cjk> + 0x51F5,0x9981, // <cjk> + 0x51F6,0x8BA5, // <cjk> + 0x51F8,0x93CA, // <cjk> + 0x51F9,0x899A, // <cjk> + 0x51FA,0x8F6F, // <cjk> + 0x51FD,0x949F, // <cjk> + 0x51FE,0x9982, // <cjk> + 0x5200,0x9381, // <cjk> + 0x5203,0x906E, // <cjk> + 0x5204,0x9983, // <cjk> + 0x5206,0x95AA, // <cjk> + 0x5207,0x90D8, // <cjk> + 0x5208,0x8AA0, // <cjk> + 0x520A,0x8AA7, // <cjk> + 0x520B,0x9984, // <cjk> + 0x520E,0x9986, // <cjk> + 0x5211,0x8C59, // <cjk> + 0x5214,0x9985, // <cjk> + 0x5217,0x97F1, // <cjk> + 0x521D,0x8F89, // <cjk> + 0x5224,0x94BB, // <cjk> + 0x5225,0x95CA, // <cjk> + 0x5227,0x9987, // <cjk> + 0x5229,0x9798, // <cjk> + 0x522A,0x9988, // <cjk> + 0x522E,0x9989, // <cjk> + 0x5230,0x939E, // <cjk> + 0x5233,0x998A, // <cjk> + 0x5236,0x90A7, // <cjk> + 0x5237,0x8DFC, // <cjk> + 0x5238,0x8C94, // <cjk> + 0x5239,0x998B, // <cjk> + 0x523A,0x8E68, // <cjk> + 0x523B,0x8D8F, // <cjk> + 0x5243,0x92E4, // <cjk> + 0x5244,0x998D, // <cjk> + 0x5247,0x91A5, // <cjk> + 0x524A,0x8DED, // <cjk> + 0x524B,0x998E, // <cjk> + 0x524C,0x998F, // <cjk> + 0x524D,0x914F, // <cjk> + 0x524F,0x998C, // <cjk> + 0x5254,0x9991, // <cjk> + 0x5256,0x9655, // <cjk> + 0x525B,0x8D84, // <cjk> + 0x525E,0x9990, // <cjk> + 0x5263,0x8C95, // <cjk> + 0x5264,0x8DDC, // <cjk> + 0x5265,0x948D, // <cjk> + 0x5269,0x9994, // <cjk> + 0x526A,0x9992, // <cjk> + 0x526F,0x959B, // <cjk> + 0x5270,0x8FE8, // <cjk> + 0x5271,0x999B, // <cjk> + 0x5272,0x8A84, // <cjk> + 0x5273,0x9995, // <cjk> + 0x5274,0x9993, // <cjk> + 0x5275,0x916E, // <cjk> + 0x527D,0x9997, // <cjk> + 0x527F,0x9996, // <cjk> + 0x5283,0x8A63, // <cjk> + 0x5287,0x8C80, // <cjk> + 0x5288,0x999C, // <cjk> + 0x5289,0x97AB, // <cjk> + 0x528D,0x9998, // <cjk> + 0x5291,0x999D, // <cjk> + 0x5292,0x999A, // <cjk> + 0x5294,0x9999, // <cjk> + 0x529B,0x97CD, // <cjk> + 0x529F,0x8CF7, // <cjk> + 0x52A0,0x89C1, // <cjk> + 0x52A3,0x97F2, // <cjk> + 0x52A9,0x8F95, // <cjk> + 0x52AA,0x9377, // <cjk> + 0x52AB,0x8D85, // <cjk> + 0x52AC,0x99A0, // <cjk> + 0x52AD,0x99A1, // <cjk> + 0x52B1,0x97E3, // <cjk> + 0x52B4,0x984A, // <cjk> + 0x52B5,0x99A3, // <cjk> + 0x52B9,0x8CF8, // <cjk> + 0x52BC,0x99A2, // <cjk> + 0x52BE,0x8A4E, // <cjk> + 0x52C1,0x99A4, // <cjk> + 0x52C3,0x9675, // <cjk> + 0x52C5,0x92BA, // <cjk> + 0x52C7,0x9745, // <cjk> + 0x52C9,0x95D7, // <cjk> + 0x52CD,0x99A5, // <cjk> + 0x52D2,0xE8D3, // <cjk> + 0x52D5,0x93AE, // <cjk> + 0x52D7,0x99A6, // <cjk> + 0x52D8,0x8AA8, // <cjk> + 0x52D9,0x96B1, // <cjk> + 0x52DD,0x8F9F, // <cjk> + 0x52DE,0x99A7, // <cjk> + 0x52DF,0x95E5, // <cjk> + 0x52E0,0x99AB, // <cjk> + 0x52E2,0x90A8, // <cjk> + 0x52E3,0x99A8, // <cjk> + 0x52E4,0x8BCE, // <cjk> + 0x52E6,0x99A9, // <cjk> + 0x52E7,0x8AA9, // <cjk> + 0x52F2,0x8C4D, // <cjk> + 0x52F3,0x99AC, // <cjk> + 0x52F5,0x99AD, // <cjk> + 0x52F8,0x99AE, // <cjk> + 0x52F9,0x99AF, // <cjk> + 0x52FA,0x8ED9, // <cjk> + 0x52FE,0x8CF9, // <cjk> + 0x52FF,0x96DC, // <cjk> + 0x5301,0x96E6, // <cjk> + 0x5302,0x93F5, // <cjk> + 0x5305,0x95EF, // <cjk> + 0x5306,0x99B0, // <cjk> + 0x5308,0x99B1, // <cjk> + 0x530D,0x99B3, // <cjk> + 0x530F,0x99B5, // <cjk> + 0x5310,0x99B4, // <cjk> + 0x5315,0x99B6, // <cjk> + 0x5316,0x89BB, // <cjk> + 0x5317,0x966B, // <cjk> + 0x5319,0x8DFA, // <cjk> + 0x531A,0x99B7, // <cjk> + 0x531D,0x9178, // <cjk> + 0x5320,0x8FA0, // <cjk> + 0x5321,0x8BA7, // <cjk> + 0x5323,0x99B8, // <cjk> + 0x532A,0x94D9, // <cjk> + 0x532F,0x99B9, // <cjk> + 0x5331,0x99BA, // <cjk> + 0x5333,0x99BB, // <cjk> + 0x5338,0x99BC, // <cjk> + 0x5339,0x9543, // <cjk> + 0x533A,0x8BE6, // <cjk> + 0x533B,0x88E3, // <cjk> + 0x533F,0x93BD, // <cjk> + 0x5340,0x99BD, // <cjk> + 0x5341,0x8F5C, // <cjk> + 0x5343,0x90E7, // <cjk> + 0x5345,0x99BF, // <cjk> + 0x5346,0x99BE, // <cjk> + 0x5347,0x8FA1, // <cjk> + 0x5348,0x8CDF, // <cjk> + 0x5349,0x99C1, // <cjk> + 0x534A,0x94BC, // <cjk> + 0x534D,0x99C2, // <cjk> + 0x5351,0x94DA, // <cjk> + 0x5352,0x91B2, // <cjk> + 0x5353,0x91EC, // <cjk> + 0x5354,0x8BA6, // <cjk> + 0x5357,0x93EC, // <cjk> + 0x5358,0x9250, // <cjk> + 0x535A,0x948E, // <cjk> + 0x535C,0x966D, // <cjk> + 0x535E,0x99C4, // <cjk> + 0x5360,0x90E8, // <cjk> + 0x5366,0x8C54, // <cjk> + 0x5369,0x99C5, // <cjk> + 0x536E,0x99C6, // <cjk> + 0x536F,0x894B, // <cjk> + 0x5370,0x88F3, // <cjk> + 0x5371,0x8AEB, // <cjk> + 0x5373,0x91A6, // <cjk> + 0x5374,0x8B70, // <cjk> + 0x5375,0x9791, // <cjk> + 0x5377,0x99C9, // <cjk> + 0x5378,0x89B5, // <cjk> + 0x537B,0x99C8, // <cjk> + 0x537F,0x8BA8, // <cjk> + 0x5382,0x99CA, // <cjk> + 0x5384,0x96EF, // <cjk> + 0x5396,0x99CB, // <cjk> + 0x5398,0x97D0, // <cjk> + 0x539A,0x8CFA, // <cjk> + 0x539F,0x8CB4, // <cjk> + 0x53A0,0x99CC, // <cjk> + 0x53A5,0x99CE, // <cjk> + 0x53A6,0x99CD, // <cjk> + 0x53A8,0x907E, // <cjk> + 0x53A9,0x8958, // <cjk> + 0x53AD,0x897D, // <cjk> + 0x53AE,0x99CF, // <cjk> + 0x53B0,0x99D0, // <cjk> + 0x53B3,0x8CB5, // <cjk> + 0x53B6,0x99D1, // <cjk> + 0x53BB,0x8B8E, // <cjk> + 0x53C2,0x8E51, // <cjk> + 0x53C3,0x99D2, // <cjk> + 0x53C8,0x9694, // <cjk> + 0x53C9,0x8DB3, // <cjk> + 0x53CA,0x8B79, // <cjk> + 0x53CB,0x9746, // <cjk> + 0x53CC,0x916F, // <cjk> + 0x53CD,0x94BD, // <cjk> + 0x53CE,0x8EFB, // <cjk> + 0x53D4,0x8F66, // <cjk> + 0x53D6,0x8EE6, // <cjk> + 0x53D7,0x8EF3, // <cjk> + 0x53D9,0x8F96, // <cjk> + 0x53DB,0x94BE, // <cjk> + 0x53DF,0x99D5, // <cjk> + 0x53E1,0x8962, // <cjk> + 0x53E2,0x9170, // <cjk> + 0x53E3,0x8CFB, // <cjk> + 0x53E4,0x8CC3, // <cjk> + 0x53E5,0x8BE5, // <cjk> + 0x53E8,0x99D9, // <cjk> + 0x53E9,0x9240, // <cjk> + 0x53EA,0x91FC, // <cjk> + 0x53EB,0x8BA9, // <cjk> + 0x53EC,0x8FA2, // <cjk> + 0x53ED,0x99DA, // <cjk> + 0x53EE,0x99D8, // <cjk> + 0x53EF,0x89C2, // <cjk> + 0x53F0,0x91E4, // <cjk> + 0x53F1,0x8EB6, // <cjk> + 0x53F2,0x8E6A, // <cjk> + 0x53F3,0x8945, // <cjk> + 0x53F6,0x8A90, // <cjk> + 0x53F7,0x8D86, // <cjk> + 0x53F8,0x8E69, // <cjk> + 0x53FA,0x99DB, // <cjk> + 0x5401,0x99DC, // <cjk> + 0x5403,0x8B68, // <cjk> + 0x5404,0x8A65, // <cjk> + 0x5408,0x8D87, // <cjk> + 0x5409,0x8B67, // <cjk> + 0x540A,0x92DD, // <cjk> + 0x540B,0x8944, // <cjk> + 0x540C,0x93AF, // <cjk> + 0x540D,0x96BC, // <cjk> + 0x540E,0x8D40, // <cjk> + 0x540F,0x9799, // <cjk> + 0x5410,0x9366, // <cjk> + 0x5411,0x8CFC, // <cjk> + 0x541B,0x8C4E, // <cjk> + 0x541D,0x99E5, // <cjk> + 0x541F,0x8BE1, // <cjk> + 0x5420,0x9669, // <cjk> + 0x5426,0x94DB, // <cjk> + 0x5429,0x99E4, // <cjk> + 0x542B,0x8ADC, // <cjk> + 0x542C,0x99DF, // <cjk> + 0x542D,0x99E0, // <cjk> + 0x542E,0x99E2, // <cjk> + 0x5436,0x99E3, // <cjk> + 0x5438,0x8B7A, // <cjk> + 0x5439,0x9081, // <cjk> + 0x543B,0x95AB, // <cjk> + 0x543C,0x99E1, // <cjk> + 0x543D,0x99DD, // <cjk> + 0x543E,0x8CE1, // <cjk> + 0x5440,0x99DE, // <cjk> + 0x5442,0x9843, // <cjk> + 0x5446,0x95F0, // <cjk> + 0x5448,0x92E6, // <cjk> + 0x5449,0x8CE0, // <cjk> + 0x544A,0x8D90, // <cjk> + 0x544E,0x99E6, // <cjk> + 0x5451,0x93DB, // <cjk> + 0x545F,0x99EA, // <cjk> + 0x5468,0x8EFC, // <cjk> + 0x546A,0x8EF4, // <cjk> + 0x5470,0x99ED, // <cjk> + 0x5471,0x99EB, // <cjk> + 0x5473,0x96A1, // <cjk> + 0x5475,0x99E8, // <cjk> + 0x5476,0x99F1, // <cjk> + 0x5477,0x99EC, // <cjk> + 0x547B,0x99EF, // <cjk> + 0x547C,0x8CC4, // <cjk> + 0x547D,0x96BD, // <cjk> + 0x5480,0x99F0, // <cjk> + 0x5484,0x99F2, // <cjk> + 0x5486,0x99F4, // <cjk> + 0x548B,0x8DEE, // <cjk> + 0x548C,0x9861, // <cjk> + 0x548E,0x99E9, // <cjk> + 0x548F,0x99E7, // <cjk> + 0x5490,0x99F3, // <cjk> + 0x5492,0x99EE, // <cjk> + 0x54A2,0x99F6, // <cjk> + 0x54A4,0x9A42, // <cjk> + 0x54A5,0x99F8, // <cjk> + 0x54A8,0x99FC, // <cjk> + 0x54AB,0x9A40, // <cjk> + 0x54AC,0x99F9, // <cjk> + 0x54AF,0x9A5D, // <cjk> + 0x54B2,0x8DE7, // <cjk> + 0x54B3,0x8A50, // <cjk> + 0x54B8,0x99F7, // <cjk> + 0x54BC,0x9A44, // <cjk> + 0x54BD,0x88F4, // <cjk> + 0x54BE,0x9A43, // <cjk> + 0x54C0,0x88A3, // <cjk> + 0x54C1,0x9569, // <cjk> + 0x54C2,0x9A41, // <cjk> + 0x54C4,0x99FA, // <cjk> + 0x54C7,0x99F5, // <cjk> + 0x54C8,0x99FB, // <cjk> + 0x54C9,0x8DC6, // <cjk> + 0x54D8,0x9A45, // <cjk> + 0x54E1,0x88F5, // <cjk> + 0x54E2,0x9A4E, // <cjk> + 0x54E5,0x9A46, // <cjk> + 0x54E6,0x9A47, // <cjk> + 0x54E8,0x8FA3, // <cjk> + 0x54E9,0x9689, // <cjk> + 0x54ED,0x9A4C, // <cjk> + 0x54EE,0x9A4B, // <cjk> + 0x54F2,0x934E, // <cjk> + 0x54FA,0x9A4D, // <cjk> + 0x54FD,0x9A4A, // <cjk> + 0x5504,0x8953, // <cjk> + 0x5506,0x8DB4, // <cjk> + 0x5507,0x904F, // <cjk> + 0x550F,0x9A48, // <cjk> + 0x5510,0x9382, // <cjk> + 0x5514,0x9A49, // <cjk> + 0x5516,0x88A0, // <cjk> + 0x552E,0x9A53, // <cjk> + 0x552F,0x9742, // <cjk> + 0x5531,0x8FA5, // <cjk> + 0x5533,0x9A59, // <cjk> + 0x5538,0x9A58, // <cjk> + 0x5539,0x9A4F, // <cjk> + 0x553E,0x91C1, // <cjk> + 0x5540,0x9A50, // <cjk> + 0x5544,0x91ED, // <cjk> + 0x5545,0x9A55, // <cjk> + 0x5546,0x8FA4, // <cjk> + 0x554C,0x9A52, // <cjk> + 0x554F,0x96E2, // <cjk> + 0x5556,0x9A56, // <cjk> + 0x5557,0x9A57, // <cjk> + 0x555C,0x9A54, // <cjk> + 0x555D,0x9A5A, // <cjk> + 0x5563,0x9A51, // <cjk> + 0x557B,0x9A60, // <cjk> + 0x557C,0x9A65, // <cjk> + 0x557E,0x9A61, // <cjk> + 0x5580,0x9A5C, // <cjk> + 0x5583,0x9A66, // <cjk> + 0x5584,0x9150, // <cjk> + 0x5587,0x9A68, // <cjk> + 0x5589,0x8D41, // <cjk> + 0x558A,0x9A5E, // <cjk> + 0x558B,0x929D, // <cjk> + 0x5598,0x9A62, // <cjk> + 0x559A,0x8AAB, // <cjk> + 0x559C,0x8AEC, // <cjk> + 0x559D,0x8A85, // <cjk> + 0x559E,0x9A63, // <cjk> + 0x559F,0x9A5F, // <cjk> + 0x55A7,0x8C96, // <cjk> + 0x55A8,0x9A69, // <cjk> + 0x55A9,0x9A67, // <cjk> + 0x55AA,0x9172, // <cjk> + 0x55AB,0x8B69, // <cjk> + 0x55AC,0x8BAA, // <cjk> + 0x55AE,0x9A64, // <cjk> + 0x55B0,0x8BF2, // <cjk> + 0x55B6,0x8963, // <cjk> + 0x55C4,0x9A6D, // <cjk> + 0x55C5,0x9A6B, // <cjk> + 0x55C7,0x9AA5, // <cjk> + 0x55D4,0x9A70, // <cjk> + 0x55DA,0x9A6A, // <cjk> + 0x55DC,0x9A6E, // <cjk> + 0x55DF,0x9A6C, // <cjk> + 0x55E3,0x8E6B, // <cjk> + 0x55E4,0x9A6F, // <cjk> + 0x55F7,0x9A72, // <cjk> + 0x55F9,0x9A77, // <cjk> + 0x55FD,0x9A75, // <cjk> + 0x55FE,0x9A74, // <cjk> + 0x5606,0x9251, // <cjk> + 0x5609,0x89C3, // <cjk> + 0x5614,0x9A71, // <cjk> + 0x5616,0x9A73, // <cjk> + 0x5617,0x8FA6, // <cjk> + 0x5618,0x8952, // <cjk> + 0x561B,0x9A76, // <cjk> + 0x5629,0x89DC, // <cjk> + 0x562F,0x9A82, // <cjk> + 0x5631,0x8FFA, // <cjk> + 0x5632,0x9A7D, // <cjk> + 0x5634,0x9A7B, // <cjk> + 0x5636,0x9A7C, // <cjk> + 0x5638,0x9A7E, // <cjk> + 0x5642,0x895C, // <cjk> + 0x564C,0x9158, // <cjk> + 0x564E,0x9A78, // <cjk> + 0x5650,0x9A79, // <cjk> + 0x565B,0x8A9A, // <cjk> + 0x5664,0x9A81, // <cjk> + 0x5668,0x8AED, // <cjk> + 0x566A,0x9A84, // <cjk> + 0x566B,0x9A80, // <cjk> + 0x566C,0x9A83, // <cjk> + 0x5674,0x95AC, // <cjk> + 0x5678,0x93D3, // <cjk> + 0x567A,0x94B6, // <cjk> + 0x5680,0x9A86, // <cjk> + 0x5686,0x9A85, // <cjk> + 0x5687,0x8A64, // <cjk> + 0x568A,0x9A87, // <cjk> + 0x568F,0x9A8A, // <cjk> + 0x5694,0x9A89, // <cjk> + 0x56A0,0x9A88, // <cjk> + 0x56A2,0x9458, // <cjk> + 0x56A5,0x9A8B, // <cjk> + 0x56AE,0x9A8C, // <cjk> + 0x56B4,0x9A8E, // <cjk> + 0x56B6,0x9A8D, // <cjk> + 0x56BC,0x9A90, // <cjk> + 0x56C0,0x9A93, // <cjk> + 0x56C1,0x9A91, // <cjk> + 0x56C2,0x9A8F, // <cjk> + 0x56C3,0x9A92, // <cjk> + 0x56C8,0x9A94, // <cjk> + 0x56CE,0x9A95, // <cjk> + 0x56D1,0x9A96, // <cjk> + 0x56D3,0x9A97, // <cjk> + 0x56D7,0x9A98, // <cjk> + 0x56D8,0x9964, // <cjk> + 0x56DA,0x8EFA, // <cjk> + 0x56DB,0x8E6C, // <cjk> + 0x56DE,0x89F1, // <cjk> + 0x56E0,0x88F6, // <cjk> + 0x56E3,0x9263, // <cjk> + 0x56EE,0x9A99, // <cjk> + 0x56F0,0x8DA2, // <cjk> + 0x56F2,0x88CD, // <cjk> + 0x56F3,0x907D, // <cjk> + 0x56F9,0x9A9A, // <cjk> + 0x56FA,0x8CC5, // <cjk> + 0x56FD,0x8D91, // <cjk> + 0x56FF,0x9A9C, // <cjk> + 0x5700,0x9A9B, // <cjk> + 0x5703,0x95DE, // <cjk> + 0x5704,0x9A9D, // <cjk> + 0x5708,0x9A9F, // <cjk> + 0x5709,0x9A9E, // <cjk> + 0x570B,0x9AA0, // <cjk> + 0x570D,0x9AA1, // <cjk> + 0x570F,0x8C97, // <cjk> + 0x5712,0x8980, // <cjk> + 0x5713,0x9AA2, // <cjk> + 0x5716,0x9AA4, // <cjk> + 0x5718,0x9AA3, // <cjk> + 0x571C,0x9AA6, // <cjk> + 0x571F,0x9379, // <cjk> + 0x5726,0x9AA7, // <cjk> + 0x5727,0x88B3, // <cjk> + 0x5728,0x8DDD, // <cjk> + 0x572D,0x8C5C, // <cjk> + 0x5730,0x926E, // <cjk> + 0x5737,0x9AA8, // <cjk> + 0x5738,0x9AA9, // <cjk> + 0x573B,0x9AAB, // <cjk> + 0x5740,0x9AAC, // <cjk> + 0x5742,0x8DE2, // <cjk> + 0x5747,0x8BCF, // <cjk> + 0x574A,0x9656, // <cjk> + 0x574E,0x9AAA, // <cjk> + 0x574F,0x9AAD, // <cjk> + 0x5750,0x8DBF, // <cjk> + 0x5751,0x8D42, // <cjk> + 0x5761,0x9AB1, // <cjk> + 0x5764,0x8DA3, // <cjk> + 0x5766,0x9252, // <cjk> + 0x5769,0x9AAE, // <cjk> + 0x576A,0x92D8, // <cjk> + 0x577F,0x9AB2, // <cjk> + 0x5782,0x9082, // <cjk> + 0x5788,0x9AB0, // <cjk> + 0x5789,0x9AB3, // <cjk> + 0x578B,0x8C5E, // <cjk> + 0x5793,0x9AB4, // <cjk> + 0x57A0,0x9AB5, // <cjk> + 0x57A2,0x8D43, // <cjk> + 0x57A3,0x8A5F, // <cjk> + 0x57A4,0x9AB7, // <cjk> + 0x57AA,0x9AB8, // <cjk> + 0x57B0,0x9AB9, // <cjk> + 0x57B3,0x9AB6, // <cjk> + 0x57C0,0x9AAF, // <cjk> + 0x57C3,0x9ABA, // <cjk> + 0x57C6,0x9ABB, // <cjk> + 0x57CB,0x9684, // <cjk> + 0x57CE,0x8FE9, // <cjk> + 0x57D2,0x9ABD, // <cjk> + 0x57D3,0x9ABE, // <cjk> + 0x57D4,0x9ABC, // <cjk> + 0x57D6,0x9AC0, // <cjk> + 0x57DC,0x9457, // <cjk> + 0x57DF,0x88E6, // <cjk> + 0x57E0,0x9575, // <cjk> + 0x57E3,0x9AC1, // <cjk> + 0x57F4,0x8FFB, // <cjk> + 0x57F7,0x8EB7, // <cjk> + 0x57F9,0x947C, // <cjk> + 0x57FA,0x8AEE, // <cjk> + 0x57FC,0x8DE9, // <cjk> + 0x5800,0x9678, // <cjk> + 0x5802,0x93B0, // <cjk> + 0x5805,0x8C98, // <cjk> + 0x5806,0x91CD, // <cjk> + 0x580A,0x9ABF, // <cjk> + 0x580B,0x9AC2, // <cjk> + 0x5815,0x91C2, // <cjk> + 0x5819,0x9AC3, // <cjk> + 0x581D,0x9AC4, // <cjk> + 0x5821,0x9AC6, // <cjk> + 0x5824,0x92E7, // <cjk> + 0x582A,0x8AAC, // <cjk> + 0x582F,0xEA9F, // <cjk> + 0x5830,0x8981, // <cjk> + 0x5831,0x95F1, // <cjk> + 0x5834,0x8FEA, // <cjk> + 0x5835,0x9367, // <cjk> + 0x583A,0x8DE4, // <cjk> + 0x583D,0x9ACC, // <cjk> + 0x5840,0x95BB, // <cjk> + 0x5841,0x97DB, // <cjk> + 0x584A,0x89F2, // <cjk> + 0x584B,0x9AC8, // <cjk> + 0x5851,0x9159, // <cjk> + 0x5852,0x9ACB, // <cjk> + 0x5854,0x9383, // <cjk> + 0x5857,0x9368, // <cjk> + 0x5858,0x9384, // <cjk> + 0x5859,0x94B7, // <cjk> + 0x585A,0x92CB, // <cjk> + 0x585E,0x8DC7, // <cjk> + 0x5862,0x9AC7, // <cjk> + 0x5869,0x8996, // <cjk> + 0x586B,0x9355, // <cjk> + 0x5870,0x9AC9, // <cjk> + 0x5872,0x9AC5, // <cjk> + 0x5875,0x906F, // <cjk> + 0x5879,0x9ACD, // <cjk> + 0x587E,0x8F6D, // <cjk> + 0x5883,0x8BAB, // <cjk> + 0x5885,0x9ACE, // <cjk> + 0x5893,0x95E6, // <cjk> + 0x5897,0x919D, // <cjk> + 0x589C,0x92C4, // <cjk> + 0x589F,0x9AD0, // <cjk> + 0x58A8,0x966E, // <cjk> + 0x58AB,0x9AD1, // <cjk> + 0x58AE,0x9AD6, // <cjk> + 0x58B3,0x95AD, // <cjk> + 0x58B8,0x9AD5, // <cjk> + 0x58B9,0x9ACF, // <cjk> + 0x58BA,0x9AD2, // <cjk> + 0x58BB,0x9AD4, // <cjk> + 0x58BE,0x8DA4, // <cjk> + 0x58C1,0x95C7, // <cjk> + 0x58C5,0x9AD7, // <cjk> + 0x58C7,0x9264, // <cjk> + 0x58CA,0x89F3, // <cjk> + 0x58CC,0x8FEB, // <cjk> + 0x58D1,0x9AD9, // <cjk> + 0x58D3,0x9AD8, // <cjk> + 0x58D5,0x8D88, // <cjk> + 0x58D7,0x9ADA, // <cjk> + 0x58D8,0x9ADC, // <cjk> + 0x58D9,0x9ADB, // <cjk> + 0x58DC,0x9ADE, // <cjk> + 0x58DE,0x9AD3, // <cjk> + 0x58DF,0x9AE0, // <cjk> + 0x58E4,0x9ADF, // <cjk> + 0x58E5,0x9ADD, // <cjk> + 0x58EB,0x8E6D, // <cjk> + 0x58EC,0x9070, // <cjk> + 0x58EE,0x9173, // <cjk> + 0x58EF,0x9AE1, // <cjk> + 0x58F0,0x90BA, // <cjk> + 0x58F1,0x88EB, // <cjk> + 0x58F2,0x9484, // <cjk> + 0x58F7,0x92D9, // <cjk> + 0x58F9,0x9AE3, // <cjk> + 0x58FA,0x9AE2, // <cjk> + 0x58FB,0x9AE4, // <cjk> + 0x58FC,0x9AE5, // <cjk> + 0x58FD,0x9AE6, // <cjk> + 0x5902,0x9AE7, // <cjk> + 0x5909,0x95CF, // <cjk> + 0x590A,0x9AE8, // <cjk> + 0x590F,0x89C4, // <cjk> + 0x5910,0x9AE9, // <cjk> + 0x5916,0x8A4F, // <cjk> + 0x5918,0x99C7, // <cjk> + 0x5919,0x8F67, // <cjk> + 0x591A,0x91BD, // <cjk> + 0x591B,0x9AEA, // <cjk> + 0x591C,0x96E9, // <cjk> + 0x5922,0x96B2, // <cjk> + 0x5925,0x9AEC, // <cjk> + 0x5927,0x91E5, // <cjk> + 0x5929,0x9356, // <cjk> + 0x592A,0x91BE, // <cjk> + 0x592B,0x9576, // <cjk> + 0x592C,0x9AED, // <cjk> + 0x592D,0x9AEE, // <cjk> + 0x592E,0x899B, // <cjk> + 0x5931,0x8EB8, // <cjk> + 0x5932,0x9AEF, // <cjk> + 0x5937,0x88CE, // <cjk> + 0x5938,0x9AF0, // <cjk> + 0x593E,0x9AF1, // <cjk> + 0x5944,0x8982, // <cjk> + 0x5947,0x8AEF, // <cjk> + 0x5948,0x93DE, // <cjk> + 0x5949,0x95F2, // <cjk> + 0x594E,0x9AF5, // <cjk> + 0x594F,0x9174, // <cjk> + 0x5950,0x9AF4, // <cjk> + 0x5951,0x8C5F, // <cjk> + 0x5954,0x967A, // <cjk> + 0x5955,0x9AF3, // <cjk> + 0x5957,0x9385, // <cjk> + 0x5958,0x9AF7, // <cjk> + 0x595A,0x9AF6, // <cjk> + 0x5960,0x9AF9, // <cjk> + 0x5962,0x9AF8, // <cjk> + 0x5965,0x899C, // <cjk> + 0x5967,0x9AFA, // <cjk> + 0x5968,0x8FA7, // <cjk> + 0x5969,0x9AFC, // <cjk> + 0x596A,0x9244, // <cjk> + 0x596C,0x9AFB, // <cjk> + 0x596E,0x95B1, // <cjk> + 0x5973,0x8F97, // <cjk> + 0x5974,0x937A, // <cjk> + 0x5978,0x9B40, // <cjk> + 0x597D,0x8D44, // <cjk> + 0x5981,0x9B41, // <cjk> + 0x5982,0x9440, // <cjk> + 0x5983,0x94DC, // <cjk> + 0x5984,0x96CF, // <cjk> + 0x598A,0x9444, // <cjk> + 0x598D,0x9B4A, // <cjk> + 0x5993,0x8B57, // <cjk> + 0x5996,0x9764, // <cjk> + 0x5999,0x96AD, // <cjk> + 0x599B,0x9BAA, // <cjk> + 0x599D,0x9B42, // <cjk> + 0x59A3,0x9B45, // <cjk> + 0x59A5,0x91C3, // <cjk> + 0x59A8,0x9657, // <cjk> + 0x59AC,0x9369, // <cjk> + 0x59B2,0x9B46, // <cjk> + 0x59B9,0x9685, // <cjk> + 0x59BB,0x8DC8, // <cjk> + 0x59BE,0x8FA8, // <cjk> + 0x59C6,0x9B47, // <cjk> + 0x59C9,0x8E6F, // <cjk> + 0x59CB,0x8E6E, // <cjk> + 0x59D0,0x88B7, // <cjk> + 0x59D1,0x8CC6, // <cjk> + 0x59D3,0x90A9, // <cjk> + 0x59D4,0x88CF, // <cjk> + 0x59D9,0x9B4B, // <cjk> + 0x59DA,0x9B4C, // <cjk> + 0x59DC,0x9B49, // <cjk> + 0x59E5,0x8957, // <cjk> + 0x59E6,0x8AAD, // <cjk> + 0x59E8,0x9B48, // <cjk> + 0x59EA,0x96C3, // <cjk> + 0x59EB,0x9550, // <cjk> + 0x59F6,0x88A6, // <cjk> + 0x59FB,0x88F7, // <cjk> + 0x59FF,0x8E70, // <cjk> + 0x5A01,0x88D0, // <cjk> + 0x5A03,0x88A1, // <cjk> + 0x5A09,0x9B51, // <cjk> + 0x5A11,0x9B4F, // <cjk> + 0x5A18,0x96BA, // <cjk> + 0x5A1A,0x9B52, // <cjk> + 0x5A1C,0x9B50, // <cjk> + 0x5A1F,0x9B4E, // <cjk> + 0x5A20,0x9050, // <cjk> + 0x5A25,0x9B4D, // <cjk> + 0x5A29,0x95D8, // <cjk> + 0x5A2F,0x8CE2, // <cjk> + 0x5A35,0x9B56, // <cjk> + 0x5A36,0x9B57, // <cjk> + 0x5A3C,0x8FA9, // <cjk> + 0x5A40,0x9B53, // <cjk> + 0x5A41,0x984B, // <cjk> + 0x5A46,0x946B, // <cjk> + 0x5A49,0x9B55, // <cjk> + 0x5A5A,0x8DA5, // <cjk> + 0x5A62,0x9B58, // <cjk> + 0x5A66,0x9577, // <cjk> + 0x5A6A,0x9B59, // <cjk> + 0x5A6C,0x9B54, // <cjk> + 0x5A7F,0x96B9, // <cjk> + 0x5A92,0x947D, // <cjk> + 0x5A9A,0x9B5A, // <cjk> + 0x5A9B,0x9551, // <cjk> + 0x5ABD,0x9B5F, // <cjk> + 0x5ABE,0x9B5C, // <cjk> + 0x5AC1,0x89C5, // <cjk> + 0x5AC2,0x9B5E, // <cjk> + 0x5AC9,0x8EB9, // <cjk> + 0x5ACB,0x9B5D, // <cjk> + 0x5ACC,0x8C99, // <cjk> + 0x5AD0,0x9B6B, // <cjk> + 0x5AD6,0x9B64, // <cjk> + 0x5AD7,0x9B61, // <cjk> + 0x5AE1,0x9284, // <cjk> + 0x5AE3,0x9B60, // <cjk> + 0x5AE6,0x9B62, // <cjk> + 0x5AE9,0x9B63, // <cjk> + 0x5AFA,0x9B65, // <cjk> + 0x5AFB,0x9B66, // <cjk> + 0x5B09,0x8AF0, // <cjk> + 0x5B0B,0x9B68, // <cjk> + 0x5B0C,0x9B67, // <cjk> + 0x5B16,0x9B69, // <cjk> + 0x5B22,0x8FEC, // <cjk> + 0x5B2A,0x9B6C, // <cjk> + 0x5B2C,0x92DA, // <cjk> + 0x5B30,0x8964, // <cjk> + 0x5B32,0x9B6A, // <cjk> + 0x5B36,0x9B6D, // <cjk> + 0x5B3E,0x9B6E, // <cjk> + 0x5B40,0x9B71, // <cjk> + 0x5B43,0x9B6F, // <cjk> + 0x5B45,0x9B70, // <cjk> + 0x5B50,0x8E71, // <cjk> + 0x5B51,0x9B72, // <cjk> + 0x5B54,0x8D45, // <cjk> + 0x5B55,0x9B73, // <cjk> + 0x5B57,0x8E9A, // <cjk> + 0x5B58,0x91B6, // <cjk> + 0x5B5A,0x9B74, // <cjk> + 0x5B5B,0x9B75, // <cjk> + 0x5B5C,0x8E79, // <cjk> + 0x5B5D,0x8D46, // <cjk> + 0x5B5F,0x96D0, // <cjk> + 0x5B63,0x8B47, // <cjk> + 0x5B64,0x8CC7, // <cjk> + 0x5B65,0x9B76, // <cjk> + 0x5B66,0x8A77, // <cjk> + 0x5B69,0x9B77, // <cjk> + 0x5B6B,0x91B7, // <cjk> + 0x5B70,0x9B78, // <cjk> + 0x5B71,0x9BA1, // <cjk> + 0x5B73,0x9B79, // <cjk> + 0x5B75,0x9B7A, // <cjk> + 0x5B78,0x9B7B, // <cjk> + 0x5B7A,0x9B7D, // <cjk> + 0x5B80,0x9B7E, // <cjk> + 0x5B83,0x9B80, // <cjk> + 0x5B85,0x91EE, // <cjk> + 0x5B87,0x8946, // <cjk> + 0x5B88,0x8EE7, // <cjk> + 0x5B89,0x88C0, // <cjk> + 0x5B8B,0x9176, // <cjk> + 0x5B8C,0x8AAE, // <cjk> + 0x5B8D,0x8EB3, // <cjk> + 0x5B8F,0x8D47, // <cjk> + 0x5B95,0x9386, // <cjk> + 0x5B97,0x8F40, // <cjk> + 0x5B98,0x8AAF, // <cjk> + 0x5B99,0x9288, // <cjk> + 0x5B9A,0x92E8, // <cjk> + 0x5B9B,0x88B6, // <cjk> + 0x5B9C,0x8B58, // <cjk> + 0x5B9D,0x95F3, // <cjk> + 0x5B9F,0x8EC0, // <cjk> + 0x5BA2,0x8B71, // <cjk> + 0x5BA3,0x90E9, // <cjk> + 0x5BA4,0x8EBA, // <cjk> + 0x5BA5,0x9747, // <cjk> + 0x5BA6,0x9B81, // <cjk> + 0x5BAE,0x8B7B, // <cjk> + 0x5BB0,0x8DC9, // <cjk> + 0x5BB3,0x8A51, // <cjk> + 0x5BB4,0x8983, // <cjk> + 0x5BB5,0x8FAA, // <cjk> + 0x5BB6,0x89C6, // <cjk> + 0x5BB8,0x9B82, // <cjk> + 0x5BB9,0x9765, // <cjk> + 0x5BBF,0x8F68, // <cjk> + 0x5BC2,0x8EE2, // <cjk> + 0x5BC3,0x9B83, // <cjk> + 0x5BC4,0x8AF1, // <cjk> + 0x5BC5,0x93D0, // <cjk> + 0x5BC6,0x96A7, // <cjk> + 0x5BC7,0x9B84, // <cjk> + 0x5BC9,0x9B85, // <cjk> + 0x5BCC,0x9578, // <cjk> + 0x5BD0,0x9B87, // <cjk> + 0x5BD2,0x8AA6, // <cjk> + 0x5BD3,0x8BF5, // <cjk> + 0x5BD4,0x9B86, // <cjk> + 0x5BDB,0x8AB0, // <cjk> + 0x5BDD,0x9051, // <cjk> + 0x5BDE,0x9B8B, // <cjk> + 0x5BDF,0x8E40, // <cjk> + 0x5BE1,0x89C7, // <cjk> + 0x5BE2,0x9B8A, // <cjk> + 0x5BE4,0x9B88, // <cjk> + 0x5BE5,0x9B8C, // <cjk> + 0x5BE6,0x9B89, // <cjk> + 0x5BE7,0x944A, // <cjk> + 0x5BE8,0x9ECB, // <cjk> + 0x5BE9,0x9052, // <cjk> + 0x5BEB,0x9B8D, // <cjk> + 0x5BEE,0x97BE, // <cjk> + 0x5BF0,0x9B8E, // <cjk> + 0x5BF3,0x9B90, // <cjk> + 0x5BF5,0x929E, // <cjk> + 0x5BF6,0x9B8F, // <cjk> + 0x5BF8,0x90A1, // <cjk> + 0x5BFA,0x8E9B, // <cjk> + 0x5BFE,0x91CE, // <cjk> + 0x5BFF,0x8EF5, // <cjk> + 0x5C01,0x9595, // <cjk> + 0x5C02,0x90EA, // <cjk> + 0x5C04,0x8ECB, // <cjk> + 0x5C05,0x9B91, // <cjk> + 0x5C06,0x8FAB, // <cjk> + 0x5C07,0x9B92, // <cjk> + 0x5C08,0x9B93, // <cjk> + 0x5C09,0x88D1, // <cjk> + 0x5C0A,0x91B8, // <cjk> + 0x5C0B,0x9071, // <cjk> + 0x5C0D,0x9B94, // <cjk> + 0x5C0E,0x93B1, // <cjk> + 0x5C0F,0x8FAC, // <cjk> + 0x5C11,0x8FAD, // <cjk> + 0x5C13,0x9B95, // <cjk> + 0x5C16,0x90EB, // <cjk> + 0x5C1A,0x8FAE, // <cjk> + 0x5C20,0x9B96, // <cjk> + 0x5C22,0x9B97, // <cjk> + 0x5C24,0x96DE, // <cjk> + 0x5C28,0x9B98, // <cjk> + 0x5C2D,0x8BC4, // <cjk> + 0x5C31,0x8F41, // <cjk> + 0x5C38,0x9B99, // <cjk> + 0x5C39,0x9B9A, // <cjk> + 0x5C3A,0x8EDA, // <cjk> + 0x5C3B,0x904B, // <cjk> + 0x5C3C,0x93F2, // <cjk> + 0x5C3D,0x9073, // <cjk> + 0x5C3E,0x94F6, // <cjk> + 0x5C3F,0x9441, // <cjk> + 0x5C40,0x8BC7, // <cjk> + 0x5C41,0x9B9B, // <cjk> + 0x5C45,0x8B8F, // <cjk> + 0x5C46,0x9B9C, // <cjk> + 0x5C48,0x8BFC, // <cjk> + 0x5C4A,0x93CD, // <cjk> + 0x5C4B,0x89AE, // <cjk> + 0x5C4D,0x8E72, // <cjk> + 0x5C4E,0x9B9D, // <cjk> + 0x5C4F,0x9BA0, // <cjk> + 0x5C50,0x9B9F, // <cjk> + 0x5C51,0x8BFB, // <cjk> + 0x5C53,0x9B9E, // <cjk> + 0x5C55,0x9357, // <cjk> + 0x5C5E,0x91AE, // <cjk> + 0x5C60,0x936A, // <cjk> + 0x5C61,0x8EC6, // <cjk> + 0x5C64,0x9177, // <cjk> + 0x5C65,0x979A, // <cjk> + 0x5C6C,0x9BA2, // <cjk> + 0x5C6E,0x9BA3, // <cjk> + 0x5C6F,0x93D4, // <cjk> + 0x5C71,0x8E52, // <cjk> + 0x5C76,0x9BA5, // <cjk> + 0x5C79,0x9BA6, // <cjk> + 0x5C8C,0x9BA7, // <cjk> + 0x5C90,0x8AF2, // <cjk> + 0x5C91,0x9BA8, // <cjk> + 0x5C94,0x9BA9, // <cjk> + 0x5CA1,0x89AA, // <cjk> + 0x5CA8,0x915A, // <cjk> + 0x5CA9,0x8AE2, // <cjk> + 0x5CAB,0x9BAB, // <cjk> + 0x5CAC,0x96A6, // <cjk> + 0x5CB1,0x91D0, // <cjk> + 0x5CB3,0x8A78, // <cjk> + 0x5CB6,0x9BAD, // <cjk> + 0x5CB7,0x9BAF, // <cjk> + 0x5CB8,0x8ADD, // <cjk> + 0x5CBB,0x9BAC, // <cjk> + 0x5CBC,0x9BAE, // <cjk> + 0x5CBE,0x9BB1, // <cjk> + 0x5CC5,0x9BB0, // <cjk> + 0x5CC7,0x9BB2, // <cjk> + 0x5CD9,0x9BB3, // <cjk> + 0x5CE0,0x93BB, // <cjk> + 0x5CE1,0x8BAC, // <cjk> + 0x5CE8,0x89E3, // <cjk> + 0x5CE9,0x9BB4, // <cjk> + 0x5CEA,0x9BB9, // <cjk> + 0x5CED,0x9BB7, // <cjk> + 0x5CEF,0x95F5, // <cjk> + 0x5CF0,0x95F4, // <cjk> + 0x5CF6,0x9387, // <cjk> + 0x5CFA,0x9BB6, // <cjk> + 0x5CFB,0x8F73, // <cjk> + 0x5CFD,0x9BB5, // <cjk> + 0x5D07,0x9092, // <cjk> + 0x5D0B,0x9BBA, // <cjk> + 0x5D0E,0x8DE8, // <cjk> + 0x5D11,0x9BC0, // <cjk> + 0x5D14,0x9BC1, // <cjk> + 0x5D15,0x9BBB, // <cjk> + 0x5D16,0x8A52, // <cjk> + 0x5D17,0x9BBC, // <cjk> + 0x5D18,0x9BC5, // <cjk> + 0x5D19,0x9BC4, // <cjk> + 0x5D1A,0x9BC3, // <cjk> + 0x5D1B,0x9BBF, // <cjk> + 0x5D1F,0x9BBE, // <cjk> + 0x5D22,0x9BC2, // <cjk> + 0x5D29,0x95F6, // <cjk> + 0x5D4B,0x9BC9, // <cjk> + 0x5D4C,0x9BC6, // <cjk> + 0x5D4E,0x9BC8, // <cjk> + 0x5D50,0x9792, // <cjk> + 0x5D52,0x9BC7, // <cjk> + 0x5D5C,0x9BBD, // <cjk> + 0x5D69,0x9093, // <cjk> + 0x5D6C,0x9BCA, // <cjk> + 0x5D6F,0x8DB5, // <cjk> + 0x5D73,0x9BCB, // <cjk> + 0x5D76,0x9BCC, // <cjk> + 0x5D82,0x9BCF, // <cjk> + 0x5D84,0x9BCE, // <cjk> + 0x5D87,0x9BCD, // <cjk> + 0x5D8B,0x9388, // <cjk> + 0x5D8C,0x9BB8, // <cjk> + 0x5D90,0x9BD5, // <cjk> + 0x5D9D,0x9BD1, // <cjk> + 0x5DA2,0x9BD0, // <cjk> + 0x5DAC,0x9BD2, // <cjk> + 0x5DAE,0x9BD3, // <cjk> + 0x5DB7,0x9BD6, // <cjk> + 0x5DBA,0x97E4, // <cjk> + 0x5DBC,0x9BD7, // <cjk> + 0x5DBD,0x9BD4, // <cjk> + 0x5DC9,0x9BD8, // <cjk> + 0x5DCC,0x8ADE, // <cjk> + 0x5DCD,0x9BD9, // <cjk> + 0x5DD2,0x9BDB, // <cjk> + 0x5DD3,0x9BDA, // <cjk> + 0x5DD6,0x9BDC, // <cjk> + 0x5DDB,0x9BDD, // <cjk> + 0x5DDD,0x90EC, // <cjk> + 0x5DDE,0x8F42, // <cjk> + 0x5DE1,0x8F84, // <cjk> + 0x5DE3,0x9183, // <cjk> + 0x5DE5,0x8D48, // <cjk> + 0x5DE6,0x8DB6, // <cjk> + 0x5DE7,0x8D49, // <cjk> + 0x5DE8,0x8B90, // <cjk> + 0x5DEB,0x9BDE, // <cjk> + 0x5DEE,0x8DB7, // <cjk> + 0x5DF1,0x8CC8, // <cjk> + 0x5DF2,0x9BDF, // <cjk> + 0x5DF3,0x96A4, // <cjk> + 0x5DF4,0x9462, // <cjk> + 0x5DF5,0x9BE0, // <cjk> + 0x5DF7,0x8D4A, // <cjk> + 0x5DFB,0x8AAA, // <cjk> + 0x5DFD,0x9246, // <cjk> + 0x5DFE,0x8BD0, // <cjk> + 0x5E02,0x8E73, // <cjk> + 0x5E03,0x957A, // <cjk> + 0x5E06,0x94BF, // <cjk> + 0x5E0B,0x9BE1, // <cjk> + 0x5E0C,0x8AF3, // <cjk> + 0x5E11,0x9BE4, // <cjk> + 0x5E16,0x929F, // <cjk> + 0x5E19,0x9BE3, // <cjk> + 0x5E1A,0x9BE2, // <cjk> + 0x5E1B,0x9BE5, // <cjk> + 0x5E1D,0x92E9, // <cjk> + 0x5E25,0x9083, // <cjk> + 0x5E2B,0x8E74, // <cjk> + 0x5E2D,0x90C8, // <cjk> + 0x5E2F,0x91D1, // <cjk> + 0x5E30,0x8B41, // <cjk> + 0x5E33,0x92A0, // <cjk> + 0x5E36,0x9BE6, // <cjk> + 0x5E37,0x9BE7, // <cjk> + 0x5E38,0x8FED, // <cjk> + 0x5E3D,0x9658, // <cjk> + 0x5E40,0x9BEA, // <cjk> + 0x5E43,0x9BE9, // <cjk> + 0x5E44,0x9BE8, // <cjk> + 0x5E45,0x959D, // <cjk> + 0x5E47,0x9BF1, // <cjk> + 0x5E4C,0x9679, // <cjk> + 0x5E4E,0x9BEB, // <cjk> + 0x5E54,0x9BED, // <cjk> + 0x5E55,0x968B, // <cjk> + 0x5E57,0x9BEC, // <cjk> + 0x5E5F,0x9BEE, // <cjk> + 0x5E61,0x94A6, // <cjk> + 0x5E62,0x9BEF, // <cjk> + 0x5E63,0x95BC, // <cjk> + 0x5E64,0x9BF0, // <cjk> + 0x5E72,0x8AB1, // <cjk> + 0x5E73,0x95BD, // <cjk> + 0x5E74,0x944E, // <cjk> + 0x5E75,0x9BF2, // <cjk> + 0x5E76,0x9BF3, // <cjk> + 0x5E78,0x8D4B, // <cjk> + 0x5E79,0x8AB2, // <cjk> + 0x5E7A,0x9BF4, // <cjk> + 0x5E7B,0x8CB6, // <cjk> + 0x5E7C,0x9763, // <cjk> + 0x5E7D,0x9748, // <cjk> + 0x5E7E,0x8AF4, // <cjk> + 0x5E7F,0x9BF6, // <cjk> + 0x5E81,0x92A1, // <cjk> + 0x5E83,0x8D4C, // <cjk> + 0x5E84,0x8FAF, // <cjk> + 0x5E87,0x94DD, // <cjk> + 0x5E8A,0x8FB0, // <cjk> + 0x5E8F,0x8F98, // <cjk> + 0x5E95,0x92EA, // <cjk> + 0x5E96,0x95F7, // <cjk> + 0x5E97,0x9358, // <cjk> + 0x5E9A,0x8D4D, // <cjk> + 0x5E9C,0x957B, // <cjk> + 0x5EA0,0x9BF7, // <cjk> + 0x5EA6,0x9378, // <cjk> + 0x5EA7,0x8DC0, // <cjk> + 0x5EAB,0x8CC9, // <cjk> + 0x5EAD,0x92EB, // <cjk> + 0x5EB5,0x88C1, // <cjk> + 0x5EB6,0x8F8E, // <cjk> + 0x5EB7,0x8D4E, // <cjk> + 0x5EB8,0x9766, // <cjk> + 0x5EC1,0x9BF8, // <cjk> + 0x5EC2,0x9BF9, // <cjk> + 0x5EC3,0x9470, // <cjk> + 0x5EC8,0x9BFA, // <cjk> + 0x5EC9,0x97F5, // <cjk> + 0x5ECA,0x984C, // <cjk> + 0x5ECF,0x9BFC, // <cjk> + 0x5ED0,0x9BFB, // <cjk> + 0x5ED3,0x8A66, // <cjk> + 0x5ED6,0x9C40, // <cjk> + 0x5EDA,0x9C43, // <cjk> + 0x5EDB,0x9C44, // <cjk> + 0x5EDD,0x9C42, // <cjk> + 0x5EDF,0x955F, // <cjk> + 0x5EE0,0x8FB1, // <cjk> + 0x5EE1,0x9C46, // <cjk> + 0x5EE2,0x9C45, // <cjk> + 0x5EE3,0x9C41, // <cjk> + 0x5EE8,0x9C47, // <cjk> + 0x5EE9,0x9C48, // <cjk> + 0x5EEC,0x9C49, // <cjk> + 0x5EF0,0x9C4C, // <cjk> + 0x5EF1,0x9C4A, // <cjk> + 0x5EF3,0x9C4B, // <cjk> + 0x5EF4,0x9C4D, // <cjk> + 0x5EF6,0x8984, // <cjk> + 0x5EF7,0x92EC, // <cjk> + 0x5EF8,0x9C4E, // <cjk> + 0x5EFA,0x8C9A, // <cjk> + 0x5EFB,0x89F4, // <cjk> + 0x5EFC,0x9455, // <cjk> + 0x5EFE,0x9C4F, // <cjk> + 0x5EFF,0x93F9, // <cjk> + 0x5F01,0x95D9, // <cjk> + 0x5F03,0x9C50, // <cjk> + 0x5F04,0x984D, // <cjk> + 0x5F09,0x9C51, // <cjk> + 0x5F0A,0x95BE, // <cjk> + 0x5F0B,0x9C54, // <cjk> + 0x5F0C,0x989F, // <cjk> + 0x5F0D,0x98AF, // <cjk> + 0x5F0F,0x8EAE, // <cjk> + 0x5F10,0x93F3, // <cjk> + 0x5F11,0x9C55, // <cjk> + 0x5F13,0x8B7C, // <cjk> + 0x5F14,0x92A2, // <cjk> + 0x5F15,0x88F8, // <cjk> + 0x5F16,0x9C56, // <cjk> + 0x5F17,0x95A4, // <cjk> + 0x5F18,0x8D4F, // <cjk> + 0x5F1B,0x926F, // <cjk> + 0x5F1F,0x92ED, // <cjk> + 0x5F25,0x96ED, // <cjk> + 0x5F26,0x8CB7, // <cjk> + 0x5F27,0x8CCA, // <cjk> + 0x5F29,0x9C57, // <cjk> + 0x5F2D,0x9C58, // <cjk> + 0x5F2F,0x9C5E, // <cjk> + 0x5F31,0x8EE3, // <cjk> + 0x5F35,0x92A3, // <cjk> + 0x5F37,0x8BAD, // <cjk> + 0x5F38,0x9C59, // <cjk> + 0x5F3C,0x954A, // <cjk> + 0x5F3E,0x9265, // <cjk> + 0x5F41,0x9C5A, // <cjk> + 0x5F4A,0x8BAE, // <cjk> + 0x5F4C,0x9C5C, // <cjk> + 0x5F4E,0x9C5D, // <cjk> + 0x5F51,0x9C5F, // <cjk> + 0x5F53,0x9396, // <cjk> + 0x5F56,0x9C60, // <cjk> + 0x5F57,0x9C61, // <cjk> + 0x5F59,0x9C62, // <cjk> + 0x5F5C,0x9C53, // <cjk> + 0x5F5D,0x9C52, // <cjk> + 0x5F61,0x9C63, // <cjk> + 0x5F62,0x8C60, // <cjk> + 0x5F66,0x9546, // <cjk> + 0x5F69,0x8DCA, // <cjk> + 0x5F6A,0x9556, // <cjk> + 0x5F6B,0x92A4, // <cjk> + 0x5F6C,0x956A, // <cjk> + 0x5F6D,0x9C64, // <cjk> + 0x5F70,0x8FB2, // <cjk> + 0x5F71,0x8965, // <cjk> + 0x5F73,0x9C65, // <cjk> + 0x5F77,0x9C66, // <cjk> + 0x5F79,0x96F0, // <cjk> + 0x5F7C,0x94DE, // <cjk> + 0x5F7F,0x9C69, // <cjk> + 0x5F80,0x899D, // <cjk> + 0x5F81,0x90AA, // <cjk> + 0x5F82,0x9C68, // <cjk> + 0x5F83,0x9C67, // <cjk> + 0x5F84,0x8C61, // <cjk> + 0x5F85,0x91D2, // <cjk> + 0x5F87,0x9C6D, // <cjk> + 0x5F88,0x9C6B, // <cjk> + 0x5F8A,0x9C6A, // <cjk> + 0x5F8B,0x97A5, // <cjk> + 0x5F8C,0x8CE3, // <cjk> + 0x5F90,0x8F99, // <cjk> + 0x5F91,0x9C6C, // <cjk> + 0x5F92,0x936B, // <cjk> + 0x5F93,0x8F5D, // <cjk> + 0x5F97,0x93BE, // <cjk> + 0x5F98,0x9C70, // <cjk> + 0x5F99,0x9C6F, // <cjk> + 0x5F9E,0x9C6E, // <cjk> + 0x5FA0,0x9C71, // <cjk> + 0x5FA1,0x8CE4, // <cjk> + 0x5FA8,0x9C72, // <cjk> + 0x5FA9,0x959C, // <cjk> + 0x5FAA,0x8F7A, // <cjk> + 0x5FAD,0x9C73, // <cjk> + 0x5FAE,0x94F7, // <cjk> + 0x5FB3,0x93BF, // <cjk> + 0x5FB4,0x92A5, // <cjk> + 0x5FB9,0x934F, // <cjk> + 0x5FBC,0x9C74, // <cjk> + 0x5FBD,0x8B4A, // <cjk> + 0x5FC3,0x9053, // <cjk> + 0x5FC5,0x954B, // <cjk> + 0x5FCC,0x8AF5, // <cjk> + 0x5FCD,0x9445, // <cjk> + 0x5FD6,0x9C75, // <cjk> + 0x5FD7,0x8E75, // <cjk> + 0x5FD8,0x9659, // <cjk> + 0x5FD9,0x965A, // <cjk> + 0x5FDC,0x899E, // <cjk> + 0x5FDD,0x9C7A, // <cjk> + 0x5FE0,0x9289, // <cjk> + 0x5FE4,0x9C77, // <cjk> + 0x5FEB,0x89F5, // <cjk> + 0x5FF0,0x9CAB, // <cjk> + 0x5FF1,0x9C79, // <cjk> + 0x5FF5,0x944F, // <cjk> + 0x5FF8,0x9C78, // <cjk> + 0x5FFB,0x9C76, // <cjk> + 0x5FFD,0x8D9A, // <cjk> + 0x5FFF,0x9C7C, // <cjk> + 0x600E,0x9C83, // <cjk> + 0x600F,0x9C89, // <cjk> + 0x6010,0x9C81, // <cjk> + 0x6012,0x937B, // <cjk> + 0x6015,0x9C86, // <cjk> + 0x6016,0x957C, // <cjk> + 0x6019,0x9C80, // <cjk> + 0x601B,0x9C85, // <cjk> + 0x601C,0x97E5, // <cjk> + 0x601D,0x8E76, // <cjk> + 0x6020,0x91D3, // <cjk> + 0x6021,0x9C7D, // <cjk> + 0x6025,0x8B7D, // <cjk> + 0x6026,0x9C88, // <cjk> + 0x6027,0x90AB, // <cjk> + 0x6028,0x8985, // <cjk> + 0x6029,0x9C82, // <cjk> + 0x602A,0x89F6, // <cjk> + 0x602B,0x9C87, // <cjk> + 0x602F,0x8BAF, // <cjk> + 0x6031,0x9C84, // <cjk> + 0x603A,0x9C8A, // <cjk> + 0x6041,0x9C8C, // <cjk> + 0x6042,0x9C96, // <cjk> + 0x6043,0x9C94, // <cjk> + 0x6046,0x9C91, // <cjk> + 0x604A,0x9C90, // <cjk> + 0x604B,0x97F6, // <cjk> + 0x604D,0x9C92, // <cjk> + 0x6050,0x8BB0, // <cjk> + 0x6052,0x8D50, // <cjk> + 0x6055,0x8F9A, // <cjk> + 0x6059,0x9C99, // <cjk> + 0x605A,0x9C8B, // <cjk> + 0x605F,0x9C8F, // <cjk> + 0x6060,0x9C7E, // <cjk> + 0x6062,0x89F8, // <cjk> + 0x6063,0x9C93, // <cjk> + 0x6064,0x9C95, // <cjk> + 0x6065,0x9270, // <cjk> + 0x6068,0x8DA6, // <cjk> + 0x6069,0x89B6, // <cjk> + 0x606A,0x9C8D, // <cjk> + 0x606B,0x9C98, // <cjk> + 0x606C,0x9C97, // <cjk> + 0x606D,0x8BB1, // <cjk> + 0x606F,0x91A7, // <cjk> + 0x6070,0x8A86, // <cjk> + 0x6075,0x8C62, // <cjk> + 0x6077,0x9C8E, // <cjk> + 0x6081,0x9C9A, // <cjk> + 0x6083,0x9C9D, // <cjk> + 0x6084,0x9C9F, // <cjk> + 0x6089,0x8EBB, // <cjk> + 0x608B,0x9CA5, // <cjk> + 0x608C,0x92EE, // <cjk> + 0x608D,0x9C9B, // <cjk> + 0x6092,0x9CA3, // <cjk> + 0x6094,0x89F7, // <cjk> + 0x6096,0x9CA1, // <cjk> + 0x6097,0x9CA2, // <cjk> + 0x609A,0x9C9E, // <cjk> + 0x609B,0x9CA0, // <cjk> + 0x609F,0x8CE5, // <cjk> + 0x60A0,0x9749, // <cjk> + 0x60A3,0x8AB3, // <cjk> + 0x60A6,0x8978, // <cjk> + 0x60A7,0x9CA4, // <cjk> + 0x60A9,0x9459, // <cjk> + 0x60AA,0x88AB, // <cjk> + 0x60B2,0x94DF, // <cjk> + 0x60B3,0x9C7B, // <cjk> + 0x60B4,0x9CAA, // <cjk> + 0x60B5,0x9CAE, // <cjk> + 0x60B6,0x96E3, // <cjk> + 0x60B8,0x9CA7, // <cjk> + 0x60BC,0x9389, // <cjk> + 0x60BD,0x9CAC, // <cjk> + 0x60C5,0x8FEE, // <cjk> + 0x60C6,0x9CAD, // <cjk> + 0x60C7,0x93D5, // <cjk> + 0x60D1,0x9866, // <cjk> + 0x60D3,0x9CA9, // <cjk> + 0x60D8,0x9CAF, // <cjk> + 0x60DA,0x8D9B, // <cjk> + 0x60DC,0x90C9, // <cjk> + 0x60DF,0x88D2, // <cjk> + 0x60E0,0x9CA8, // <cjk> + 0x60E1,0x9CA6, // <cjk> + 0x60E3,0x9179, // <cjk> + 0x60E7,0x9C9C, // <cjk> + 0x60E8,0x8E53, // <cjk> + 0x60F0,0x91C4, // <cjk> + 0x60F1,0x9CBB, // <cjk> + 0x60F3,0x917A, // <cjk> + 0x60F4,0x9CB6, // <cjk> + 0x60F6,0x9CB3, // <cjk> + 0x60F7,0x9CB4, // <cjk> + 0x60F9,0x8EE4, // <cjk> + 0x60FA,0x9CB7, // <cjk> + 0x60FB,0x9CBA, // <cjk> + 0x6100,0x9CB5, // <cjk> + 0x6101,0x8F44, // <cjk> + 0x6103,0x9CB8, // <cjk> + 0x6106,0x9CB2, // <cjk> + 0x6108,0x96FA, // <cjk> + 0x6109,0x96F9, // <cjk> + 0x610D,0x9CBC, // <cjk> + 0x610E,0x9CBD, // <cjk> + 0x610F,0x88D3, // <cjk> + 0x6115,0x9CB1, // <cjk> + 0x611A,0x8BF0, // <cjk> + 0x611B,0x88A4, // <cjk> + 0x611F,0x8AB4, // <cjk> + 0x6121,0x9CB9, // <cjk> + 0x6127,0x9CC1, // <cjk> + 0x6128,0x9CC0, // <cjk> + 0x612C,0x9CC5, // <cjk> + 0x6134,0x9CC6, // <cjk> + 0x613C,0x9CC4, // <cjk> + 0x613D,0x9CC7, // <cjk> + 0x613E,0x9CBF, // <cjk> + 0x613F,0x9CC3, // <cjk> + 0x6142,0x9CC8, // <cjk> + 0x6144,0x9CC9, // <cjk> + 0x6147,0x9CBE, // <cjk> + 0x6148,0x8E9C, // <cjk> + 0x614A,0x9CC2, // <cjk> + 0x614B,0x91D4, // <cjk> + 0x614C,0x8D51, // <cjk> + 0x614D,0x9CB0, // <cjk> + 0x614E,0x9054, // <cjk> + 0x6153,0x9CD6, // <cjk> + 0x6155,0x95E7, // <cjk> + 0x6158,0x9CCC, // <cjk> + 0x6159,0x9CCD, // <cjk> + 0x615A,0x9CCE, // <cjk> + 0x615D,0x9CD5, // <cjk> + 0x615F,0x9CD4, // <cjk> + 0x6162,0x969D, // <cjk> + 0x6163,0x8AB5, // <cjk> + 0x6165,0x9CD2, // <cjk> + 0x6167,0x8C64, // <cjk> + 0x6168,0x8A53, // <cjk> + 0x616B,0x9CCF, // <cjk> + 0x616E,0x97B6, // <cjk> + 0x616F,0x9CD1, // <cjk> + 0x6170,0x88D4, // <cjk> + 0x6171,0x9CD3, // <cjk> + 0x6173,0x9CCA, // <cjk> + 0x6174,0x9CD0, // <cjk> + 0x6175,0x9CD7, // <cjk> + 0x6176,0x8C63, // <cjk> + 0x6177,0x9CCB, // <cjk> + 0x617E,0x977C, // <cjk> + 0x6182,0x974A, // <cjk> + 0x6187,0x9CDA, // <cjk> + 0x618A,0x9CDE, // <cjk> + 0x618E,0x919E, // <cjk> + 0x6190,0x97F7, // <cjk> + 0x6191,0x9CDF, // <cjk> + 0x6194,0x9CDC, // <cjk> + 0x6196,0x9CD9, // <cjk> + 0x6199,0x9CD8, // <cjk> + 0x619A,0x9CDD, // <cjk> + 0x61A4,0x95AE, // <cjk> + 0x61A7,0x93B2, // <cjk> + 0x61A9,0x8C65, // <cjk> + 0x61AB,0x9CE0, // <cjk> + 0x61AC,0x9CDB, // <cjk> + 0x61AE,0x9CE1, // <cjk> + 0x61B2,0x8C9B, // <cjk> + 0x61B6,0x89AF, // <cjk> + 0x61BA,0x9CE9, // <cjk> + 0x61BE,0x8AB6, // <cjk> + 0x61C3,0x9CE7, // <cjk> + 0x61C6,0x9CE8, // <cjk> + 0x61C7,0x8DA7, // <cjk> + 0x61C8,0x9CE6, // <cjk> + 0x61C9,0x9CE4, // <cjk> + 0x61CA,0x9CE3, // <cjk> + 0x61CB,0x9CEA, // <cjk> + 0x61CC,0x9CE2, // <cjk> + 0x61CD,0x9CEC, // <cjk> + 0x61D0,0x89F9, // <cjk> + 0x61E3,0x9CEE, // <cjk> + 0x61E6,0x9CED, // <cjk> + 0x61F2,0x92A6, // <cjk> + 0x61F4,0x9CF1, // <cjk> + 0x61F6,0x9CEF, // <cjk> + 0x61F7,0x9CE5, // <cjk> + 0x61F8,0x8C9C, // <cjk> + 0x61FA,0x9CF0, // <cjk> + 0x61FC,0x9CF4, // <cjk> + 0x61FD,0x9CF3, // <cjk> + 0x61FE,0x9CF5, // <cjk> + 0x61FF,0x9CF2, // <cjk> + 0x6200,0x9CF6, // <cjk> + 0x6208,0x9CF7, // <cjk> + 0x6209,0x9CF8, // <cjk> + 0x620A,0x95E8, // <cjk> + 0x620C,0x9CFA, // <cjk> + 0x620D,0x9CF9, // <cjk> + 0x620E,0x8F5E, // <cjk> + 0x6210,0x90AC, // <cjk> + 0x6211,0x89E4, // <cjk> + 0x6212,0x89FA, // <cjk> + 0x6214,0x9CFB, // <cjk> + 0x6216,0x88BD, // <cjk> + 0x621A,0x90CA, // <cjk> + 0x621B,0x9CFC, // <cjk> + 0x621D,0xE6C1, // <cjk> + 0x621E,0x9D40, // <cjk> + 0x621F,0x8C81, // <cjk> + 0x6221,0x9D41, // <cjk> + 0x6226,0x90ED, // <cjk> + 0x622A,0x9D42, // <cjk> + 0x622E,0x9D43, // <cjk> + 0x622F,0x8B59, // <cjk> + 0x6230,0x9D44, // <cjk> + 0x6232,0x9D45, // <cjk> + 0x6233,0x9D46, // <cjk> + 0x6234,0x91D5, // <cjk> + 0x6238,0x8CCB, // <cjk> + 0x623B,0x96DF, // <cjk> + 0x6240,0x8F8A, // <cjk> + 0x6241,0x9D47, // <cjk> + 0x6247,0x90EE, // <cjk> + 0x6248,0xE7BB, // <cjk> + 0x6249,0x94E0, // <cjk> + 0x624B,0x8EE8, // <cjk> + 0x624D,0x8DCB, // <cjk> + 0x624E,0x9D48, // <cjk> + 0x6253,0x91C5, // <cjk> + 0x6255,0x95A5, // <cjk> + 0x6258,0x91EF, // <cjk> + 0x625B,0x9D4B, // <cjk> + 0x625E,0x9D49, // <cjk> + 0x6260,0x9D4C, // <cjk> + 0x6263,0x9D4A, // <cjk> + 0x6268,0x9D4D, // <cjk> + 0x626E,0x95AF, // <cjk> + 0x6271,0x88B5, // <cjk> + 0x6276,0x957D, // <cjk> + 0x6279,0x94E1, // <cjk> + 0x627C,0x9D4E, // <cjk> + 0x627E,0x9D51, // <cjk> + 0x627F,0x8FB3, // <cjk> + 0x6280,0x8B5A, // <cjk> + 0x6282,0x9D4F, // <cjk> + 0x6283,0x9D56, // <cjk> + 0x6284,0x8FB4, // <cjk> + 0x6289,0x9D50, // <cjk> + 0x628A,0x9463, // <cjk> + 0x6291,0x977D, // <cjk> + 0x6292,0x9D52, // <cjk> + 0x6293,0x9D53, // <cjk> + 0x6294,0x9D57, // <cjk> + 0x6295,0x938A, // <cjk> + 0x6296,0x9D54, // <cjk> + 0x6297,0x8D52, // <cjk> + 0x6298,0x90DC, // <cjk> + 0x629B,0x9D65, // <cjk> + 0x629C,0x94B2, // <cjk> + 0x629E,0x91F0, // <cjk> + 0x62AB,0x94E2, // <cjk> + 0x62AC,0x9DAB, // <cjk> + 0x62B1,0x95F8, // <cjk> + 0x62B5,0x92EF, // <cjk> + 0x62B9,0x9695, // <cjk> + 0x62BB,0x9D5A, // <cjk> + 0x62BC,0x899F, // <cjk> + 0x62BD,0x928A, // <cjk> + 0x62C2,0x9D63, // <cjk> + 0x62C5,0x9253, // <cjk> + 0x62C6,0x9D5D, // <cjk> + 0x62C7,0x9D64, // <cjk> + 0x62C8,0x9D5F, // <cjk> + 0x62C9,0x9D66, // <cjk> + 0x62CA,0x9D62, // <cjk> + 0x62CC,0x9D61, // <cjk> + 0x62CD,0x948F, // <cjk> + 0x62D0,0x89FB, // <cjk> + 0x62D1,0x9D59, // <cjk> + 0x62D2,0x8B91, // <cjk> + 0x62D3,0x91F1, // <cjk> + 0x62D4,0x9D55, // <cjk> + 0x62D7,0x9D58, // <cjk> + 0x62D8,0x8D53, // <cjk> + 0x62D9,0x90D9, // <cjk> + 0x62DB,0x8FB5, // <cjk> + 0x62DC,0x9D60, // <cjk> + 0x62DD,0x9471, // <cjk> + 0x62E0,0x8B92, // <cjk> + 0x62E1,0x8A67, // <cjk> + 0x62EC,0x8A87, // <cjk> + 0x62ED,0x9040, // <cjk> + 0x62EE,0x9D68, // <cjk> + 0x62EF,0x9D6D, // <cjk> + 0x62F1,0x9D69, // <cjk> + 0x62F3,0x8C9D, // <cjk> + 0x62F5,0x9D6E, // <cjk> + 0x62F6,0x8E41, // <cjk> + 0x62F7,0x8D89, // <cjk> + 0x62FE,0x8F45, // <cjk> + 0x62FF,0x9D5C, // <cjk> + 0x6301,0x8E9D, // <cjk> + 0x6302,0x9D6B, // <cjk> + 0x6307,0x8E77, // <cjk> + 0x6308,0x9D6C, // <cjk> + 0x6309,0x88C2, // <cjk> + 0x630C,0x9D67, // <cjk> + 0x6311,0x92A7, // <cjk> + 0x6319,0x8B93, // <cjk> + 0x631F,0x8BB2, // <cjk> + 0x6327,0x9D6A, // <cjk> + 0x6328,0x88A5, // <cjk> + 0x632B,0x8DC1, // <cjk> + 0x632F,0x9055, // <cjk> + 0x633A,0x92F0, // <cjk> + 0x633D,0x94D2, // <cjk> + 0x633E,0x9D70, // <cjk> + 0x633F,0x917D, // <cjk> + 0x6349,0x91A8, // <cjk> + 0x634C,0x8E4A, // <cjk> + 0x634D,0x9D71, // <cjk> + 0x634F,0x9D73, // <cjk> + 0x6350,0x9D6F, // <cjk> + 0x6355,0x95DF, // <cjk> + 0x6357,0x92BB, // <cjk> + 0x635C,0x917B, // <cjk> + 0x6367,0x95F9, // <cjk> + 0x6368,0x8ECC, // <cjk> + 0x6369,0x9D80, // <cjk> + 0x636B,0x9D7E, // <cjk> + 0x636E,0x9098, // <cjk> + 0x6372,0x8C9E, // <cjk> + 0x6376,0x9D78, // <cjk> + 0x6377,0x8FB7, // <cjk> + 0x637A,0x93E6, // <cjk> + 0x637B,0x9450, // <cjk> + 0x6380,0x9D76, // <cjk> + 0x6383,0x917C, // <cjk> + 0x6388,0x8EF6, // <cjk> + 0x6389,0x9D7B, // <cjk> + 0x638C,0x8FB6, // <cjk> + 0x638E,0x9D75, // <cjk> + 0x638F,0x9D7A, // <cjk> + 0x6392,0x9472, // <cjk> + 0x6396,0x9D74, // <cjk> + 0x6398,0x8C40, // <cjk> + 0x639B,0x8A7C, // <cjk> + 0x639F,0x9D7C, // <cjk> + 0x63A0,0x97A9, // <cjk> + 0x63A1,0x8DCC, // <cjk> + 0x63A2,0x9254, // <cjk> + 0x63A3,0x9D79, // <cjk> + 0x63A5,0x90DA, // <cjk> + 0x63A7,0x8D54, // <cjk> + 0x63A8,0x9084, // <cjk> + 0x63A9,0x8986, // <cjk> + 0x63AB,0x9D77, // <cjk> + 0x63AC,0x8B64, // <cjk> + 0x63B2,0x8C66, // <cjk> + 0x63B4,0x92CD, // <cjk> + 0x63B5,0x9D7D, // <cjk> + 0x63BB,0x917E, // <cjk> + 0x63BE,0x9D81, // <cjk> + 0x63C0,0x9D83, // <cjk> + 0x63C3,0x91B5, // <cjk> + 0x63C4,0x9D89, // <cjk> + 0x63C6,0x9D84, // <cjk> + 0x63C9,0x9D86, // <cjk> + 0x63CF,0x9560, // <cjk> + 0x63D0,0x92F1, // <cjk> + 0x63D2,0x9D87, // <cjk> + 0x63D6,0x974B, // <cjk> + 0x63DA,0x9767, // <cjk> + 0x63DB,0x8AB7, // <cjk> + 0x63E1,0x88AC, // <cjk> + 0x63E3,0x9D85, // <cjk> + 0x63E9,0x9D82, // <cjk> + 0x63EE,0x8AF6, // <cjk> + 0x63F4,0x8987, // <cjk> + 0x63F6,0x9D88, // <cjk> + 0x63FA,0x9768, // <cjk> + 0x6406,0x9D8C, // <cjk> + 0x640D,0x91B9, // <cjk> + 0x640F,0x9D93, // <cjk> + 0x6413,0x9D8D, // <cjk> + 0x6416,0x9D8A, // <cjk> + 0x6417,0x9D91, // <cjk> + 0x641C,0x9D72, // <cjk> + 0x6426,0x9D8E, // <cjk> + 0x6428,0x9D92, // <cjk> + 0x642C,0x94C0, // <cjk> + 0x642D,0x938B, // <cjk> + 0x6434,0x9D8B, // <cjk> + 0x6436,0x9D8F, // <cjk> + 0x643A,0x8C67, // <cjk> + 0x643E,0x8DEF, // <cjk> + 0x6442,0x90DB, // <cjk> + 0x644E,0x9D97, // <cjk> + 0x6458,0x9345, // <cjk> + 0x6467,0x9D94, // <cjk> + 0x6469,0x9680, // <cjk> + 0x646F,0x9D95, // <cjk> + 0x6476,0x9D96, // <cjk> + 0x6478,0x96CC, // <cjk> + 0x647A,0x90A0, // <cjk> + 0x6483,0x8C82, // <cjk> + 0x6488,0x9D9D, // <cjk> + 0x6492,0x8E54, // <cjk> + 0x6493,0x9D9A, // <cjk> + 0x6495,0x9D99, // <cjk> + 0x649A,0x9451, // <cjk> + 0x649E,0x93B3, // <cjk> + 0x64A4,0x9350, // <cjk> + 0x64A5,0x9D9B, // <cjk> + 0x64A9,0x9D9C, // <cjk> + 0x64AB,0x958F, // <cjk> + 0x64AD,0x9464, // <cjk> + 0x64AE,0x8E42, // <cjk> + 0x64B0,0x90EF, // <cjk> + 0x64B2,0x966F, // <cjk> + 0x64B9,0x8A68, // <cjk> + 0x64BB,0x9DA3, // <cjk> + 0x64BC,0x9D9E, // <cjk> + 0x64C1,0x9769, // <cjk> + 0x64C2,0x9DA5, // <cjk> + 0x64C5,0x9DA1, // <cjk> + 0x64C7,0x9DA2, // <cjk> + 0x64CD,0x9180, // <cjk> + 0x64D2,0x9DA0, // <cjk> + 0x64D4,0x9D5E, // <cjk> + 0x64D8,0x9DA4, // <cjk> + 0x64DA,0x9D9F, // <cjk> + 0x64E0,0x9DA9, // <cjk> + 0x64E1,0x9DAA, // <cjk> + 0x64E2,0x9346, // <cjk> + 0x64E3,0x9DAC, // <cjk> + 0x64E6,0x8E43, // <cjk> + 0x64E7,0x9DA7, // <cjk> + 0x64EF,0x9DAD, // <cjk> + 0x64F1,0x9DA6, // <cjk> + 0x64F2,0x9DB1, // <cjk> + 0x64F4,0x9DB0, // <cjk> + 0x64F6,0x9DAF, // <cjk> + 0x64FA,0x9DB2, // <cjk> + 0x64FD,0x9DB4, // <cjk> + 0x64FE,0x8FEF, // <cjk> + 0x6500,0x9DB3, // <cjk> + 0x6505,0x9DB7, // <cjk> + 0x6518,0x9DB5, // <cjk> + 0x651C,0x9DB6, // <cjk> + 0x651D,0x9D90, // <cjk> + 0x6523,0x9DB9, // <cjk> + 0x6524,0x9DB8, // <cjk> + 0x652A,0x9D98, // <cjk> + 0x652B,0x9DBA, // <cjk> + 0x652C,0x9DAE, // <cjk> + 0x652F,0x8E78, // <cjk> + 0x6534,0x9DBB, // <cjk> + 0x6535,0x9DBC, // <cjk> + 0x6536,0x9DBE, // <cjk> + 0x6537,0x9DBD, // <cjk> + 0x6538,0x9DBF, // <cjk> + 0x6539,0x89FC, // <cjk> + 0x653B,0x8D55, // <cjk> + 0x653E,0x95FA, // <cjk> + 0x653F,0x90AD, // <cjk> + 0x6545,0x8CCC, // <cjk> + 0x6548,0x9DC1, // <cjk> + 0x654D,0x9DC4, // <cjk> + 0x654F,0x9571, // <cjk> + 0x6551,0x8B7E, // <cjk> + 0x6555,0x9DC3, // <cjk> + 0x6556,0x9DC2, // <cjk> + 0x6557,0x9473, // <cjk> + 0x6558,0x9DC5, // <cjk> + 0x6559,0x8BB3, // <cjk> + 0x655D,0x9DC7, // <cjk> + 0x655E,0x9DC6, // <cjk> + 0x6562,0x8AB8, // <cjk> + 0x6563,0x8E55, // <cjk> + 0x6566,0x93D6, // <cjk> + 0x656C,0x8C68, // <cjk> + 0x6570,0x9094, // <cjk> + 0x6572,0x9DC8, // <cjk> + 0x6574,0x90AE, // <cjk> + 0x6575,0x9347, // <cjk> + 0x6577,0x957E, // <cjk> + 0x6578,0x9DC9, // <cjk> + 0x6582,0x9DCA, // <cjk> + 0x6583,0x9DCB, // <cjk> + 0x6587,0x95B6, // <cjk> + 0x6588,0x9B7C, // <cjk> + 0x6589,0x90C4, // <cjk> + 0x658C,0x956B, // <cjk> + 0x658E,0x8DD6, // <cjk> + 0x6590,0x94E3, // <cjk> + 0x6591,0x94C1, // <cjk> + 0x6597,0x936C, // <cjk> + 0x6599,0x97BF, // <cjk> + 0x659B,0x9DCD, // <cjk> + 0x659C,0x8ECE, // <cjk> + 0x659F,0x9DCE, // <cjk> + 0x65A1,0x88B4, // <cjk> + 0x65A4,0x8BD2, // <cjk> + 0x65A5,0x90CB, // <cjk> + 0x65A7,0x9580, // <cjk> + 0x65AB,0x9DCF, // <cjk> + 0x65AC,0x8E61, // <cjk> + 0x65AD,0x9266, // <cjk> + 0x65AF,0x8E7A, // <cjk> + 0x65B0,0x9056, // <cjk> + 0x65B7,0x9DD0, // <cjk> + 0x65B9,0x95FB, // <cjk> + 0x65BC,0x8997, // <cjk> + 0x65BD,0x8E7B, // <cjk> + 0x65C1,0x9DD3, // <cjk> + 0x65C3,0x9DD1, // <cjk> + 0x65C4,0x9DD4, // <cjk> + 0x65C5,0x97B7, // <cjk> + 0x65C6,0x9DD2, // <cjk> + 0x65CB,0x90F9, // <cjk> + 0x65CC,0x9DD5, // <cjk> + 0x65CF,0x91B0, // <cjk> + 0x65D2,0x9DD6, // <cjk> + 0x65D7,0x8AF8, // <cjk> + 0x65D9,0x9DD8, // <cjk> + 0x65DB,0x9DD7, // <cjk> + 0x65E0,0x9DD9, // <cjk> + 0x65E1,0x9DDA, // <cjk> + 0x65E2,0x8AF9, // <cjk> + 0x65E5,0x93FA, // <cjk> + 0x65E6,0x9255, // <cjk> + 0x65E7,0x8B8C, // <cjk> + 0x65E8,0x8E7C, // <cjk> + 0x65E9,0x9181, // <cjk> + 0x65EC,0x8F7B, // <cjk> + 0x65ED,0x88AE, // <cjk> + 0x65F1,0x9DDB, // <cjk> + 0x65FA,0x89A0, // <cjk> + 0x65FB,0x9DDF, // <cjk> + 0x6602,0x8D56, // <cjk> + 0x6603,0x9DDE, // <cjk> + 0x6606,0x8DA9, // <cjk> + 0x6607,0x8FB8, // <cjk> + 0x660A,0x9DDD, // <cjk> + 0x660C,0x8FB9, // <cjk> + 0x660E,0x96BE, // <cjk> + 0x660F,0x8DA8, // <cjk> + 0x6613,0x88D5, // <cjk> + 0x6614,0x90CC, // <cjk> + 0x661C,0x9DE4, // <cjk> + 0x661F,0x90AF, // <cjk> + 0x6620,0x8966, // <cjk> + 0x6625,0x8F74, // <cjk> + 0x6627,0x9686, // <cjk> + 0x6628,0x8DF0, // <cjk> + 0x662D,0x8FBA, // <cjk> + 0x662F,0x90A5, // <cjk> + 0x6634,0x9DE3, // <cjk> + 0x6635,0x9DE1, // <cjk> + 0x6636,0x9DE2, // <cjk> + 0x663C,0x928B, // <cjk> + 0x663F,0x9E45, // <cjk> + 0x6641,0x9DE8, // <cjk> + 0x6642,0x8E9E, // <cjk> + 0x6643,0x8D57, // <cjk> + 0x6644,0x9DE6, // <cjk> + 0x6649,0x9DE7, // <cjk> + 0x664B,0x9057, // <cjk> + 0x664F,0x9DE5, // <cjk> + 0x6652,0x8E4E, // <cjk> + 0x665D,0x9DEA, // <cjk> + 0x665E,0x9DE9, // <cjk> + 0x665F,0x9DEE, // <cjk> + 0x6662,0x9DEF, // <cjk> + 0x6664,0x9DEB, // <cjk> + 0x6666,0x8A41, // <cjk> + 0x6667,0x9DEC, // <cjk> + 0x6668,0x9DED, // <cjk> + 0x6669,0x94D3, // <cjk> + 0x666E,0x9581, // <cjk> + 0x666F,0x8C69, // <cjk> + 0x6670,0x9DF0, // <cjk> + 0x6674,0x90B0, // <cjk> + 0x6676,0x8FBB, // <cjk> + 0x667A,0x9271, // <cjk> + 0x6681,0x8BC5, // <cjk> + 0x6683,0x9DF1, // <cjk> + 0x6684,0x9DF5, // <cjk> + 0x6687,0x89C9, // <cjk> + 0x6688,0x9DF2, // <cjk> + 0x6689,0x9DF4, // <cjk> + 0x668E,0x9DF3, // <cjk> + 0x6691,0x8F8B, // <cjk> + 0x6696,0x9267, // <cjk> + 0x6697,0x88C3, // <cjk> + 0x6698,0x9DF6, // <cjk> + 0x669D,0x9DF7, // <cjk> + 0x66A2,0x92A8, // <cjk> + 0x66A6,0x97EF, // <cjk> + 0x66AB,0x8E62, // <cjk> + 0x66AE,0x95E9, // <cjk> + 0x66B4,0x965C, // <cjk> + 0x66B8,0x9E41, // <cjk> + 0x66B9,0x9DF9, // <cjk> + 0x66BC,0x9DFC, // <cjk> + 0x66BE,0x9DFB, // <cjk> + 0x66C1,0x9DF8, // <cjk> + 0x66C4,0x9E40, // <cjk> + 0x66C7,0x93DC, // <cjk> + 0x66C9,0x9DFA, // <cjk> + 0x66D6,0x9E42, // <cjk> + 0x66D9,0x8F8C, // <cjk> + 0x66DA,0x9E43, // <cjk> + 0x66DC,0x976A, // <cjk> + 0x66DD,0x9498, // <cjk> + 0x66E0,0x9E44, // <cjk> + 0x66E6,0x9E46, // <cjk> + 0x66E9,0x9E47, // <cjk> + 0x66F0,0x9E48, // <cjk> + 0x66F2,0x8BC8, // <cjk> + 0x66F3,0x8967, // <cjk> + 0x66F4,0x8D58, // <cjk> + 0x66F5,0x9E49, // <cjk> + 0x66F7,0x9E4A, // <cjk> + 0x66F8,0x8F91, // <cjk> + 0x66F9,0x9182, // <cjk> + 0x66FC,0x99D6, // <cjk> + 0x66FD,0x915D, // <cjk> + 0x66FE,0x915C, // <cjk> + 0x66FF,0x91D6, // <cjk> + 0x6700,0x8DC5, // <cjk> + 0x6703,0x98F0, // <cjk> + 0x6708,0x8C8E, // <cjk> + 0x6709,0x974C, // <cjk> + 0x670B,0x95FC, // <cjk> + 0x670D,0x959E, // <cjk> + 0x670F,0x9E4B, // <cjk> + 0x6714,0x8DF1, // <cjk> + 0x6715,0x92BD, // <cjk> + 0x6716,0x9E4C, // <cjk> + 0x6717,0x984E, // <cjk> + 0x671B,0x965D, // <cjk> + 0x671D,0x92A9, // <cjk> + 0x671E,0x9E4D, // <cjk> + 0x671F,0x8AFA, // <cjk> + 0x6726,0x9E4E, // <cjk> + 0x6727,0x9E4F, // <cjk> + 0x6728,0x96D8, // <cjk> + 0x672A,0x96A2, // <cjk> + 0x672B,0x9696, // <cjk> + 0x672C,0x967B, // <cjk> + 0x672D,0x8E44, // <cjk> + 0x672E,0x9E51, // <cjk> + 0x6731,0x8EE9, // <cjk> + 0x6734,0x9670, // <cjk> + 0x6736,0x9E53, // <cjk> + 0x6737,0x9E56, // <cjk> + 0x6738,0x9E55, // <cjk> + 0x673A,0x8AF7, // <cjk> + 0x673D,0x8B80, // <cjk> + 0x673F,0x9E52, // <cjk> + 0x6741,0x9E54, // <cjk> + 0x6746,0x9E57, // <cjk> + 0x6749,0x9099, // <cjk> + 0x674E,0x979B, // <cjk> + 0x674F,0x88C7, // <cjk> + 0x6750,0x8DDE, // <cjk> + 0x6751,0x91BA, // <cjk> + 0x6753,0x8EDB, // <cjk> + 0x6756,0x8FF1, // <cjk> + 0x6759,0x9E5A, // <cjk> + 0x675C,0x936D, // <cjk> + 0x675E,0x9E58, // <cjk> + 0x675F,0x91A9, // <cjk> + 0x6760,0x9E59, // <cjk> + 0x6761,0x8FF0, // <cjk> + 0x6762,0x96DB, // <cjk> + 0x6764,0x9E5C, // <cjk> + 0x6765,0x9788, // <cjk> + 0x676A,0x9E61, // <cjk> + 0x676D,0x8D59, // <cjk> + 0x676F,0x9474, // <cjk> + 0x6770,0x9E5E, // <cjk> + 0x6771,0x938C, // <cjk> + 0x6772,0x9DDC, // <cjk> + 0x6773,0x9DE0, // <cjk> + 0x6775,0x8B6E, // <cjk> + 0x6777,0x9466, // <cjk> + 0x677C,0x9E60, // <cjk> + 0x677E,0x8FBC, // <cjk> + 0x677F,0x94C2, // <cjk> + 0x6785,0x9E66, // <cjk> + 0x6787,0x94F8, // <cjk> + 0x6789,0x9E5D, // <cjk> + 0x678B,0x9E63, // <cjk> + 0x678C,0x9E62, // <cjk> + 0x6790,0x90CD, // <cjk> + 0x6795,0x968D, // <cjk> + 0x6797,0x97D1, // <cjk> + 0x679A,0x9687, // <cjk> + 0x679C,0x89CA, // <cjk> + 0x679D,0x8E7D, // <cjk> + 0x67A0,0x9867, // <cjk> + 0x67A1,0x9E65, // <cjk> + 0x67A2,0x9095, // <cjk> + 0x67A6,0x9E64, // <cjk> + 0x67A9,0x9E5F, // <cjk> + 0x67AF,0x8CCD, // <cjk> + 0x67B3,0x9E6B, // <cjk> + 0x67B4,0x9E69, // <cjk> + 0x67B6,0x89CB, // <cjk> + 0x67B7,0x9E67, // <cjk> + 0x67B8,0x9E6D, // <cjk> + 0x67B9,0x9E73, // <cjk> + 0x67C1,0x91C6, // <cjk> + 0x67C4,0x95BF, // <cjk> + 0x67C6,0x9E75, // <cjk> + 0x67CA,0x9541, // <cjk> + 0x67CE,0x9E74, // <cjk> + 0x67CF,0x9490, // <cjk> + 0x67D0,0x965E, // <cjk> + 0x67D1,0x8AB9, // <cjk> + 0x67D3,0x90F5, // <cjk> + 0x67D4,0x8F5F, // <cjk> + 0x67D8,0x92D1, // <cjk> + 0x67DA,0x974D, // <cjk> + 0x67DD,0x9E70, // <cjk> + 0x67DE,0x9E6F, // <cjk> + 0x67E2,0x9E71, // <cjk> + 0x67E4,0x9E6E, // <cjk> + 0x67E7,0x9E76, // <cjk> + 0x67E9,0x9E6C, // <cjk> + 0x67EC,0x9E6A, // <cjk> + 0x67EE,0x9E72, // <cjk> + 0x67EF,0x9E68, // <cjk> + 0x67F1,0x928C, // <cjk> + 0x67F3,0x96F6, // <cjk> + 0x67F4,0x8EC4, // <cjk> + 0x67F5,0x8DF2, // <cjk> + 0x67FB,0x8DB8, // <cjk> + 0x67FE,0x968F, // <cjk> + 0x67FF,0x8A60, // <cjk> + 0x6802,0x92CC, // <cjk> + 0x6803,0x93C8, // <cjk> + 0x6804,0x8968, // <cjk> + 0x6813,0x90F0, // <cjk> + 0x6816,0x90B2, // <cjk> + 0x6817,0x8C49, // <cjk> + 0x681E,0x9E78, // <cjk> + 0x6821,0x8D5A, // <cjk> + 0x6822,0x8A9C, // <cjk> + 0x6829,0x9E7A, // <cjk> + 0x682A,0x8A94, // <cjk> + 0x682B,0x9E81, // <cjk> + 0x6832,0x9E7D, // <cjk> + 0x6834,0x90F1, // <cjk> + 0x6838,0x8A6A, // <cjk> + 0x6839,0x8DAA, // <cjk> + 0x683C,0x8A69, // <cjk> + 0x683D,0x8DCD, // <cjk> + 0x6840,0x9E7B, // <cjk> + 0x6841,0x8C85, // <cjk> + 0x6842,0x8C6A, // <cjk> + 0x6843,0x938D, // <cjk> + 0x6846,0x9E79, // <cjk> + 0x6848,0x88C4, // <cjk> + 0x684D,0x9E7C, // <cjk> + 0x684E,0x9E7E, // <cjk> + 0x6850,0x8BCB, // <cjk> + 0x6851,0x8C4B, // <cjk> + 0x6853,0x8ABA, // <cjk> + 0x6854,0x8B6A, // <cjk> + 0x6859,0x9E82, // <cjk> + 0x685C,0x8DF7, // <cjk> + 0x685D,0x9691, // <cjk> + 0x685F,0x8E56, // <cjk> + 0x6863,0x9E83, // <cjk> + 0x6867,0x954F, // <cjk> + 0x6874,0x9E8F, // <cjk> + 0x6876,0x89B1, // <cjk> + 0x6877,0x9E84, // <cjk> + 0x687E,0x9E95, // <cjk> + 0x687F,0x9E85, // <cjk> + 0x6881,0x97C0, // <cjk> + 0x6883,0x9E8C, // <cjk> + 0x6885,0x947E, // <cjk> + 0x688D,0x9E94, // <cjk> + 0x688F,0x9E87, // <cjk> + 0x6893,0x88B2, // <cjk> + 0x6894,0x9E89, // <cjk> + 0x689B,0x9E8B, // <cjk> + 0x689D,0x9E8A, // <cjk> + 0x689F,0x9E86, // <cjk> + 0x68A0,0x9E91, // <cjk> + 0x68A2,0x8FBD, // <cjk> + 0x68A6,0x9AEB, // <cjk> + 0x68A7,0x8CE6, // <cjk> + 0x68A8,0x979C, // <cjk> + 0x68AD,0x9E88, // <cjk> + 0x68AF,0x92F2, // <cjk> + 0x68B0,0x8A42, // <cjk> + 0x68B1,0x8DAB, // <cjk> + 0x68B3,0x9E80, // <cjk> + 0x68B5,0x9E90, // <cjk> + 0x68B6,0x8A81, // <cjk> + 0x68B9,0x9E8E, // <cjk> + 0x68BA,0x9E92, // <cjk> + 0x68BC,0x938E, // <cjk> + 0x68C4,0x8AFC, // <cjk> + 0x68C6,0x9EB0, // <cjk> + 0x68C9,0x96C7, // <cjk> + 0x68CA,0x9E97, // <cjk> + 0x68CB,0x8AFB, // <cjk> + 0x68CD,0x9E9E, // <cjk> + 0x68D2,0x965F, // <cjk> + 0x68D4,0x9E9F, // <cjk> + 0x68D5,0x9EA1, // <cjk> + 0x68D7,0x9EA5, // <cjk> + 0x68D8,0x9E99, // <cjk> + 0x68DA,0x9249, // <cjk> + 0x68DF,0x938F, // <cjk> + 0x68E0,0x9EA9, // <cjk> + 0x68E1,0x9E9C, // <cjk> + 0x68E3,0x9EA6, // <cjk> + 0x68E7,0x9EA0, // <cjk> + 0x68EE,0x9058, // <cjk> + 0x68EF,0x9EAA, // <cjk> + 0x68F2,0x90B1, // <cjk> + 0x68F9,0x9EA8, // <cjk> + 0x68FA,0x8ABB, // <cjk> + 0x6900,0x986F, // <cjk> + 0x6901,0x9E96, // <cjk> + 0x6904,0x9EA4, // <cjk> + 0x6905,0x88D6, // <cjk> + 0x6908,0x9E98, // <cjk> + 0x690B,0x96B8, // <cjk> + 0x690C,0x9E9D, // <cjk> + 0x690D,0x9041, // <cjk> + 0x690E,0x92C5, // <cjk> + 0x690F,0x9E93, // <cjk> + 0x6912,0x9EA3, // <cjk> + 0x6919,0x909A, // <cjk> + 0x691A,0x9EAD, // <cjk> + 0x691B,0x8A91, // <cjk> + 0x691C,0x8C9F, // <cjk> + 0x6921,0x9EAF, // <cjk> + 0x6922,0x9E9A, // <cjk> + 0x6923,0x9EAE, // <cjk> + 0x6925,0x9EA7, // <cjk> + 0x6926,0x9E9B, // <cjk> + 0x6928,0x9EAB, // <cjk> + 0x692A,0x9EAC, // <cjk> + 0x6930,0x9EBD, // <cjk> + 0x6934,0x93CC, // <cjk> + 0x6936,0x9EA2, // <cjk> + 0x6939,0x9EB9, // <cjk> + 0x693D,0x9EBB, // <cjk> + 0x693F,0x92D6, // <cjk> + 0x694A,0x976B, // <cjk> + 0x6953,0x9596, // <cjk> + 0x6954,0x9EB6, // <cjk> + 0x6955,0x91C8, // <cjk> + 0x6959,0x9EBC, // <cjk> + 0x695A,0x915E, // <cjk> + 0x695C,0x9EB3, // <cjk> + 0x695D,0x9EC0, // <cjk> + 0x695E,0x9EBF, // <cjk> + 0x6960,0x93ED, // <cjk> + 0x6961,0x9EBE, // <cjk> + 0x6962,0x93E8, // <cjk> + 0x696A,0x9EC2, // <cjk> + 0x696B,0x9EB5, // <cjk> + 0x696D,0x8BC6, // <cjk> + 0x696E,0x9EB8, // <cjk> + 0x696F,0x8F7C, // <cjk> + 0x6973,0x9480, // <cjk> + 0x6974,0x9EBA, // <cjk> + 0x6975,0x8BC9, // <cjk> + 0x6977,0x9EB2, // <cjk> + 0x6978,0x9EB4, // <cjk> + 0x6979,0x9EB1, // <cjk> + 0x697C,0x984F, // <cjk> + 0x697D,0x8A79, // <cjk> + 0x697E,0x9EB7, // <cjk> + 0x6981,0x9EC1, // <cjk> + 0x6982,0x8A54, // <cjk> + 0x698A,0x8DE5, // <cjk> + 0x698E,0x897C, // <cjk> + 0x6991,0x9ED2, // <cjk> + 0x6994,0x9850, // <cjk> + 0x6995,0x9ED5, // <cjk> + 0x699B,0x9059, // <cjk> + 0x699C,0x9ED4, // <cjk> + 0x69A0,0x9ED3, // <cjk> + 0x69A7,0x9ED0, // <cjk> + 0x69AE,0x9EC4, // <cjk> + 0x69B1,0x9EE1, // <cjk> + 0x69B2,0x9EC3, // <cjk> + 0x69B4,0x9ED6, // <cjk> + 0x69BB,0x9ECE, // <cjk> + 0x69BE,0x9EC9, // <cjk> + 0x69BF,0x9EC6, // <cjk> + 0x69C1,0x9EC7, // <cjk> + 0x69C3,0x9ECF, // <cjk> + 0x69C7,0xEAA0, // <cjk> + 0x69CA,0x9ECC, // <cjk> + 0x69CB,0x8D5C, // <cjk> + 0x69CC,0x92C6, // <cjk> + 0x69CD,0x9184, // <cjk> + 0x69CE,0x9ECA, // <cjk> + 0x69D0,0x9EC5, // <cjk> + 0x69D3,0x9EC8, // <cjk> + 0x69D8,0x976C, // <cjk> + 0x69D9,0x968A, // <cjk> + 0x69DD,0x9ECD, // <cjk> + 0x69DE,0x9ED7, // <cjk> + 0x69E7,0x9EDF, // <cjk> + 0x69E8,0x9ED8, // <cjk> + 0x69EB,0x9EE5, // <cjk> + 0x69ED,0x9EE3, // <cjk> + 0x69F2,0x9EDE, // <cjk> + 0x69F9,0x9EDD, // <cjk> + 0x69FB,0x92CE, // <cjk> + 0x69FD,0x9185, // <cjk> + 0x69FF,0x9EDB, // <cjk> + 0x6A02,0x9ED9, // <cjk> + 0x6A05,0x9EE0, // <cjk> + 0x6A0A,0x9EE6, // <cjk> + 0x6A0B,0x94F3, // <cjk> + 0x6A0C,0x9EEC, // <cjk> + 0x6A12,0x9EE7, // <cjk> + 0x6A13,0x9EEA, // <cjk> + 0x6A14,0x9EE4, // <cjk> + 0x6A17,0x9294, // <cjk> + 0x6A19,0x9557, // <cjk> + 0x6A1B,0x9EDA, // <cjk> + 0x6A1E,0x9EE2, // <cjk> + 0x6A1F,0x8FBE, // <cjk> + 0x6A21,0x96CD, // <cjk> + 0x6A22,0x9EF6, // <cjk> + 0x6A23,0x9EE9, // <cjk> + 0x6A29,0x8CA0, // <cjk> + 0x6A2A,0x89A1, // <cjk> + 0x6A2B,0x8A7E, // <cjk> + 0x6A2E,0x9ED1, // <cjk> + 0x6A35,0x8FBF, // <cjk> + 0x6A36,0x9EEE, // <cjk> + 0x6A38,0x9EF5, // <cjk> + 0x6A39,0x8EF7, // <cjk> + 0x6A3A,0x8A92, // <cjk> + 0x6A3D,0x924D, // <cjk> + 0x6A44,0x9EEB, // <cjk> + 0x6A47,0x9EF0, // <cjk> + 0x6A48,0x9EF4, // <cjk> + 0x6A4B,0x8BB4, // <cjk> + 0x6A58,0x8B6B, // <cjk> + 0x6A59,0x9EF2, // <cjk> + 0x6A5F,0x8B40, // <cjk> + 0x6A61,0x93C9, // <cjk> + 0x6A62,0x9EF1, // <cjk> + 0x6A66,0x9EF3, // <cjk> + 0x6A72,0x9EED, // <cjk> + 0x6A78,0x9EEF, // <cjk> + 0x6A7F,0x8A80, // <cjk> + 0x6A80,0x9268, // <cjk> + 0x6A84,0x9EFA, // <cjk> + 0x6A8D,0x9EF8, // <cjk> + 0x6A8E,0x8CE7, // <cjk> + 0x6A90,0x9EF7, // <cjk> + 0x6A97,0x9F40, // <cjk> + 0x6A9C,0x9E77, // <cjk> + 0x6AA0,0x9EF9, // <cjk> + 0x6AA2,0x9EFB, // <cjk> + 0x6AA3,0x9EFC, // <cjk> + 0x6AAA,0x9F4B, // <cjk> + 0x6AAC,0x9F47, // <cjk> + 0x6AAE,0x9E8D, // <cjk> + 0x6AB3,0x9F46, // <cjk> + 0x6AB8,0x9F45, // <cjk> + 0x6ABB,0x9F42, // <cjk> + 0x6AC1,0x9EE8, // <cjk> + 0x6AC2,0x9F44, // <cjk> + 0x6AC3,0x9F43, // <cjk> + 0x6AD1,0x9F49, // <cjk> + 0x6AD3,0x9845, // <cjk> + 0x6ADA,0x9F4C, // <cjk> + 0x6ADB,0x8BF9, // <cjk> + 0x6ADE,0x9F48, // <cjk> + 0x6ADF,0x9F4A, // <cjk> + 0x6AE8,0x94A5, // <cjk> + 0x6AEA,0x9F4D, // <cjk> + 0x6AFA,0x9F51, // <cjk> + 0x6AFB,0x9F4E, // <cjk> + 0x6B04,0x9793, // <cjk> + 0x6B05,0x9F4F, // <cjk> + 0x6B0A,0x9EDC, // <cjk> + 0x6B12,0x9F52, // <cjk> + 0x6B16,0x9F53, // <cjk> + 0x6B1D,0x8954, // <cjk> + 0x6B1F,0x9F55, // <cjk> + 0x6B20,0x8C87, // <cjk> + 0x6B21,0x8E9F, // <cjk> + 0x6B23,0x8BD3, // <cjk> + 0x6B27,0x89A2, // <cjk> + 0x6B32,0x977E, // <cjk> + 0x6B37,0x9F57, // <cjk> + 0x6B38,0x9F56, // <cjk> + 0x6B39,0x9F59, // <cjk> + 0x6B3A,0x8B5C, // <cjk> + 0x6B3D,0x8BD4, // <cjk> + 0x6B3E,0x8ABC, // <cjk> + 0x6B43,0x9F5C, // <cjk> + 0x6B49,0x9F5D, // <cjk> + 0x6B4C,0x89CC, // <cjk> + 0x6B4E,0x9256, // <cjk> + 0x6B50,0x9F5E, // <cjk> + 0x6B53,0x8ABD, // <cjk> + 0x6B54,0x9F60, // <cjk> + 0x6B59,0x9F5F, // <cjk> + 0x6B5B,0x9F61, // <cjk> + 0x6B5F,0x9F62, // <cjk> + 0x6B61,0x9F63, // <cjk> + 0x6B62,0x8E7E, // <cjk> + 0x6B63,0x90B3, // <cjk> + 0x6B64,0x8D9F, // <cjk> + 0x6B66,0x9590, // <cjk> + 0x6B69,0x95E0, // <cjk> + 0x6B6A,0x9863, // <cjk> + 0x6B6F,0x8E95, // <cjk> + 0x6B73,0x8DCE, // <cjk> + 0x6B74,0x97F0, // <cjk> + 0x6B78,0x9F64, // <cjk> + 0x6B79,0x9F65, // <cjk> + 0x6B7B,0x8E80, // <cjk> + 0x6B7F,0x9F66, // <cjk> + 0x6B80,0x9F67, // <cjk> + 0x6B83,0x9F69, // <cjk> + 0x6B84,0x9F68, // <cjk> + 0x6B86,0x9677, // <cjk> + 0x6B89,0x8F7D, // <cjk> + 0x6B8A,0x8EEA, // <cjk> + 0x6B8B,0x8E63, // <cjk> + 0x6B8D,0x9F6A, // <cjk> + 0x6B95,0x9F6C, // <cjk> + 0x6B96,0x9042, // <cjk> + 0x6B98,0x9F6B, // <cjk> + 0x6B9E,0x9F6D, // <cjk> + 0x6BA4,0x9F6E, // <cjk> + 0x6BAA,0x9F6F, // <cjk> + 0x6BAB,0x9F70, // <cjk> + 0x6BAF,0x9F71, // <cjk> + 0x6BB1,0x9F73, // <cjk> + 0x6BB2,0x9F72, // <cjk> + 0x6BB3,0x9F74, // <cjk> + 0x6BB4,0x89A3, // <cjk> + 0x6BB5,0x9269, // <cjk> + 0x6BB7,0x9F75, // <cjk> + 0x6BBA,0x8E45, // <cjk> + 0x6BBB,0x8A6B, // <cjk> + 0x6BBC,0x9F76, // <cjk> + 0x6BBF,0x9361, // <cjk> + 0x6BC0,0x9ACA, // <cjk> + 0x6BC5,0x8B42, // <cjk> + 0x6BC6,0x9F77, // <cjk> + 0x6BCB,0x9F78, // <cjk> + 0x6BCD,0x95EA, // <cjk> + 0x6BCE,0x9688, // <cjk> + 0x6BD2,0x93C5, // <cjk> + 0x6BD3,0x9F79, // <cjk> + 0x6BD4,0x94E4, // <cjk> + 0x6BD8,0x94F9, // <cjk> + 0x6BDB,0x96D1, // <cjk> + 0x6BDF,0x9F7A, // <cjk> + 0x6BEB,0x9F7C, // <cjk> + 0x6BEC,0x9F7B, // <cjk> + 0x6BEF,0x9F7E, // <cjk> + 0x6BF3,0x9F7D, // <cjk> + 0x6C08,0x9F81, // <cjk> + 0x6C0F,0x8E81, // <cjk> + 0x6C11,0x96AF, // <cjk> + 0x6C13,0x9F82, // <cjk> + 0x6C14,0x9F83, // <cjk> + 0x6C17,0x8B43, // <cjk> + 0x6C1B,0x9F84, // <cjk> + 0x6C23,0x9F86, // <cjk> + 0x6C24,0x9F85, // <cjk> + 0x6C34,0x9085, // <cjk> + 0x6C37,0x9558, // <cjk> + 0x6C38,0x8969, // <cjk> + 0x6C3E,0x94C3, // <cjk> + 0x6C40,0x92F3, // <cjk> + 0x6C41,0x8F60, // <cjk> + 0x6C42,0x8B81, // <cjk> + 0x6C4E,0x94C4, // <cjk> + 0x6C50,0x8EAC, // <cjk> + 0x6C55,0x9F88, // <cjk> + 0x6C57,0x8ABE, // <cjk> + 0x6C5A,0x8998, // <cjk> + 0x6C5D,0x93F0, // <cjk> + 0x6C5E,0x9F87, // <cjk> + 0x6C5F,0x8D5D, // <cjk> + 0x6C60,0x9272, // <cjk> + 0x6C62,0x9F89, // <cjk> + 0x6C68,0x9F91, // <cjk> + 0x6C6A,0x9F8A, // <cjk> + 0x6C70,0x91BF, // <cjk> + 0x6C72,0x8B82, // <cjk> + 0x6C73,0x9F92, // <cjk> + 0x6C7A,0x8C88, // <cjk> + 0x6C7D,0x8B44, // <cjk> + 0x6C7E,0x9F90, // <cjk> + 0x6C81,0x9F8E, // <cjk> + 0x6C82,0x9F8B, // <cjk> + 0x6C83,0x9780, // <cjk> + 0x6C88,0x92BE, // <cjk> + 0x6C8C,0x93D7, // <cjk> + 0x6C8D,0x9F8C, // <cjk> + 0x6C90,0x9F94, // <cjk> + 0x6C92,0x9F93, // <cjk> + 0x6C93,0x8C42, // <cjk> + 0x6C96,0x89AB, // <cjk> + 0x6C99,0x8DB9, // <cjk> + 0x6C9A,0x9F8D, // <cjk> + 0x6C9B,0x9F8F, // <cjk> + 0x6CA1,0x9676, // <cjk> + 0x6CA2,0x91F2, // <cjk> + 0x6CAB,0x9697, // <cjk> + 0x6CAE,0x9F9C, // <cjk> + 0x6CB1,0x9F9D, // <cjk> + 0x6CB3,0x89CD, // <cjk> + 0x6CB8,0x95A6, // <cjk> + 0x6CB9,0x96FB, // <cjk> + 0x6CBA,0x9F9F, // <cjk> + 0x6CBB,0x8EA1, // <cjk> + 0x6CBC,0x8FC0, // <cjk> + 0x6CBD,0x9F98, // <cjk> + 0x6CBE,0x9F9E, // <cjk> + 0x6CBF,0x8988, // <cjk> + 0x6CC1,0x8BB5, // <cjk> + 0x6CC4,0x9F95, // <cjk> + 0x6CC5,0x9F9A, // <cjk> + 0x6CC9,0x90F2, // <cjk> + 0x6CCA,0x9491, // <cjk> + 0x6CCC,0x94E5, // <cjk> + 0x6CD3,0x9F97, // <cjk> + 0x6CD5,0x9640, // <cjk> + 0x6CD7,0x9F99, // <cjk> + 0x6CD9,0x9FA2, // <cjk> + 0x6CDB,0x9FA0, // <cjk> + 0x6CDD,0x9F9B, // <cjk> + 0x6CE1,0x9641, // <cjk> + 0x6CE2,0x9467, // <cjk> + 0x6CE3,0x8B83, // <cjk> + 0x6CE5,0x9344, // <cjk> + 0x6CE8,0x928D, // <cjk> + 0x6CEA,0x9FA3, // <cjk> + 0x6CEF,0x9FA1, // <cjk> + 0x6CF0,0x91D7, // <cjk> + 0x6CF1,0x9F96, // <cjk> + 0x6CF3,0x896A, // <cjk> + 0x6D0B,0x976D, // <cjk> + 0x6D0C,0x9FAE, // <cjk> + 0x6D12,0x9FAD, // <cjk> + 0x6D17,0x90F4, // <cjk> + 0x6D19,0x9FAA, // <cjk> + 0x6D1B,0x978C, // <cjk> + 0x6D1E,0x93B4, // <cjk> + 0x6D1F,0x9FA4, // <cjk> + 0x6D25,0x92C3, // <cjk> + 0x6D29,0x896B, // <cjk> + 0x6D2A,0x8D5E, // <cjk> + 0x6D2B,0x9FA7, // <cjk> + 0x6D32,0x8F46, // <cjk> + 0x6D33,0x9FAC, // <cjk> + 0x6D35,0x9FAB, // <cjk> + 0x6D36,0x9FA6, // <cjk> + 0x6D38,0x9FA9, // <cjk> + 0x6D3B,0x8A88, // <cjk> + 0x6D3D,0x9FA8, // <cjk> + 0x6D3E,0x9468, // <cjk> + 0x6D41,0x97AC, // <cjk> + 0x6D44,0x8FF2, // <cjk> + 0x6D45,0x90F3, // <cjk> + 0x6D59,0x9FB4, // <cjk> + 0x6D5A,0x9FB2, // <cjk> + 0x6D5C,0x956C, // <cjk> + 0x6D63,0x9FAF, // <cjk> + 0x6D64,0x9FB1, // <cjk> + 0x6D66,0x8959, // <cjk> + 0x6D69,0x8D5F, // <cjk> + 0x6D6A,0x9851, // <cjk> + 0x6D6C,0x8A5C, // <cjk> + 0x6D6E,0x9582, // <cjk> + 0x6D74,0x9781, // <cjk> + 0x6D77,0x8A43, // <cjk> + 0x6D78,0x905A, // <cjk> + 0x6D79,0x9FB3, // <cjk> + 0x6D85,0x9FB8, // <cjk> + 0x6D88,0x8FC1, // <cjk> + 0x6D8C,0x974F, // <cjk> + 0x6D8E,0x9FB5, // <cjk> + 0x6D93,0x9FB0, // <cjk> + 0x6D95,0x9FB6, // <cjk> + 0x6D99,0x97DC, // <cjk> + 0x6D9B,0x9393, // <cjk> + 0x6D9C,0x93C0, // <cjk> + 0x6DAF,0x8A55, // <cjk> + 0x6DB2,0x8974, // <cjk> + 0x6DB5,0x9FBC, // <cjk> + 0x6DB8,0x9FBF, // <cjk> + 0x6DBC,0x97C1, // <cjk> + 0x6DC0,0x9784, // <cjk> + 0x6DC5,0x9FC6, // <cjk> + 0x6DC6,0x9FC0, // <cjk> + 0x6DC7,0x9FBD, // <cjk> + 0x6DCB,0x97D2, // <cjk> + 0x6DCC,0x9FC3, // <cjk> + 0x6DD1,0x8F69, // <cjk> + 0x6DD2,0x9FC5, // <cjk> + 0x6DD5,0x9FCA, // <cjk> + 0x6DD8,0x9391, // <cjk> + 0x6DD9,0x9FC8, // <cjk> + 0x6DDE,0x9FC2, // <cjk> + 0x6DE1,0x9257, // <cjk> + 0x6DE4,0x9FC9, // <cjk> + 0x6DE6,0x9FBE, // <cjk> + 0x6DE8,0x9FC4, // <cjk> + 0x6DEA,0x9FCB, // <cjk> + 0x6DEB,0x88FA, // <cjk> + 0x6DEC,0x9FC1, // <cjk> + 0x6DEE,0x9FCC, // <cjk> + 0x6DF3,0x8F7E, // <cjk> + 0x6DF5,0x95A3, // <cjk> + 0x6DF7,0x8DAC, // <cjk> + 0x6DF9,0x9FB9, // <cjk> + 0x6DFA,0x9FC7, // <cjk> + 0x6DFB,0x9359, // <cjk> + 0x6E05,0x90B4, // <cjk> + 0x6E07,0x8A89, // <cjk> + 0x6E08,0x8DCF, // <cjk> + 0x6E09,0x8FC2, // <cjk> + 0x6E0A,0x9FBB, // <cjk> + 0x6E0B,0x8F61, // <cjk> + 0x6E13,0x8C6B, // <cjk> + 0x6E15,0x9FBA, // <cjk> + 0x6E19,0x9FD0, // <cjk> + 0x6E1A,0x8F8D, // <cjk> + 0x6E1B,0x8CB8, // <cjk> + 0x6E1D,0x9FDF, // <cjk> + 0x6E1F,0x9FD9, // <cjk> + 0x6E20,0x8B94, // <cjk> + 0x6E21,0x936E, // <cjk> + 0x6E23,0x9FD4, // <cjk> + 0x6E24,0x9FDD, // <cjk> + 0x6E25,0x88AD, // <cjk> + 0x6E26,0x8951, // <cjk> + 0x6E29,0x89B7, // <cjk> + 0x6E2B,0x9FD6, // <cjk> + 0x6E2C,0x91AA, // <cjk> + 0x6E2D,0x9FCD, // <cjk> + 0x6E2E,0x9FCF, // <cjk> + 0x6E2F,0x8D60, // <cjk> + 0x6E38,0x9FE0, // <cjk> + 0x6E3A,0x9FDB, // <cjk> + 0x6E3E,0x9FD3, // <cjk> + 0x6E43,0x9FDA, // <cjk> + 0x6E4A,0x96A9, // <cjk> + 0x6E4D,0x9FD8, // <cjk> + 0x6E4E,0x9FDC, // <cjk> + 0x6E56,0x8CCE, // <cjk> + 0x6E58,0x8FC3, // <cjk> + 0x6E5B,0x9258, // <cjk> + 0x6E5F,0x9FD2, // <cjk> + 0x6E67,0x974E, // <cjk> + 0x6E6B,0x9FD5, // <cjk> + 0x6E6E,0x9FCE, // <cjk> + 0x6E6F,0x9392, // <cjk> + 0x6E72,0x9FD1, // <cjk> + 0x6E76,0x9FD7, // <cjk> + 0x6E7E,0x9870, // <cjk> + 0x6E7F,0x8EBC, // <cjk> + 0x6E80,0x969E, // <cjk> + 0x6E82,0x9FE1, // <cjk> + 0x6E8C,0x94AC, // <cjk> + 0x6E8F,0x9FED, // <cjk> + 0x6E90,0x8CB9, // <cjk> + 0x6E96,0x8F80, // <cjk> + 0x6E98,0x9FE3, // <cjk> + 0x6E9C,0x97AD, // <cjk> + 0x6E9D,0x8D61, // <cjk> + 0x6E9F,0x9FF0, // <cjk> + 0x6EA2,0x88EC, // <cjk> + 0x6EA5,0x9FEE, // <cjk> + 0x6EAA,0x9FE2, // <cjk> + 0x6EAF,0x9FE8, // <cjk> + 0x6EB2,0x9FEA, // <cjk> + 0x6EB6,0x976E, // <cjk> + 0x6EB7,0x9FE5, // <cjk> + 0x6EBA,0x934D, // <cjk> + 0x6EBD,0x9FE7, // <cjk> + 0x6EC2,0x9FEF, // <cjk> + 0x6EC4,0x9FE9, // <cjk> + 0x6EC5,0x96C5, // <cjk> + 0x6EC9,0x9FE4, // <cjk> + 0x6ECB,0x8EA0, // <cjk> + 0x6ECC,0x9FFC, // <cjk> + 0x6ED1,0x8A8A, // <cjk> + 0x6ED3,0x9FE6, // <cjk> + 0x6ED4,0x9FEB, // <cjk> + 0x6ED5,0x9FEC, // <cjk> + 0x6EDD,0x91EA, // <cjk> + 0x6EDE,0x91D8, // <cjk> + 0x6EEC,0x9FF4, // <cjk> + 0x6EEF,0x9FFA, // <cjk> + 0x6EF2,0x9FF8, // <cjk> + 0x6EF4,0x9348, // <cjk> + 0x6EF7,0xE042, // <cjk> + 0x6EF8,0x9FF5, // <cjk> + 0x6EFE,0x9FF6, // <cjk> + 0x6EFF,0x9FDE, // <cjk> + 0x6F01,0x8B99, // <cjk> + 0x6F02,0x9559, // <cjk> + 0x6F06,0x8EBD, // <cjk> + 0x6F09,0x8D97, // <cjk> + 0x6F0F,0x9852, // <cjk> + 0x6F11,0x9FF2, // <cjk> + 0x6F13,0xE041, // <cjk> + 0x6F14,0x8989, // <cjk> + 0x6F15,0x9186, // <cjk> + 0x6F20,0x9499, // <cjk> + 0x6F22,0x8ABF, // <cjk> + 0x6F23,0x97F8, // <cjk> + 0x6F2B,0x969F, // <cjk> + 0x6F2C,0x92D0, // <cjk> + 0x6F31,0x9FF9, // <cjk> + 0x6F32,0x9FFB, // <cjk> + 0x6F38,0x9151, // <cjk> + 0x6F3E,0xE040, // <cjk> + 0x6F3F,0x9FF7, // <cjk> + 0x6F41,0x9FF1, // <cjk> + 0x6F45,0x8AC1, // <cjk> + 0x6F54,0x8C89, // <cjk> + 0x6F58,0xE04E, // <cjk> + 0x6F5B,0xE049, // <cjk> + 0x6F5C,0x90F6, // <cjk> + 0x6F5F,0x8A83, // <cjk> + 0x6F64,0x8F81, // <cjk> + 0x6F66,0xE052, // <cjk> + 0x6F6D,0xE04B, // <cjk> + 0x6F6E,0x92AA, // <cjk> + 0x6F6F,0xE048, // <cjk> + 0x6F70,0x92D7, // <cjk> + 0x6F74,0xE06B, // <cjk> + 0x6F78,0xE045, // <cjk> + 0x6F7A,0xE044, // <cjk> + 0x6F7C,0xE04D, // <cjk> + 0x6F80,0xE047, // <cjk> + 0x6F81,0xE046, // <cjk> + 0x6F82,0xE04C, // <cjk> + 0x6F84,0x909F, // <cjk> + 0x6F86,0xE043, // <cjk> + 0x6F8E,0xE04F, // <cjk> + 0x6F91,0xE050, // <cjk> + 0x6F97,0x8AC0, // <cjk> + 0x6FA1,0xE055, // <cjk> + 0x6FA3,0xE054, // <cjk> + 0x6FA4,0xE056, // <cjk> + 0x6FAA,0xE059, // <cjk> + 0x6FB1,0x9362, // <cjk> + 0x6FB3,0xE053, // <cjk> + 0x6FB9,0xE057, // <cjk> + 0x6FC0,0x8C83, // <cjk> + 0x6FC1,0x91F7, // <cjk> + 0x6FC2,0xE051, // <cjk> + 0x6FC3,0x945A, // <cjk> + 0x6FC6,0xE058, // <cjk> + 0x6FD4,0xE05D, // <cjk> + 0x6FD8,0xE05E, // <cjk> + 0x6FDB,0xE061, // <cjk> + 0x6FDF,0xE05A, // <cjk> + 0x6FE0,0x8D8A, // <cjk> + 0x6FE1,0x9447, // <cjk> + 0x6FE4,0x9FB7, // <cjk> + 0x6FEB,0x9794, // <cjk> + 0x6FEC,0xE05C, // <cjk> + 0x6FEE,0xE060, // <cjk> + 0x6FEF,0x91F3, // <cjk> + 0x6FF1,0xE05F, // <cjk> + 0x6FF3,0xE04A, // <cjk> + 0x6FF6,0xE889, // <cjk> + 0x6FFA,0xE064, // <cjk> + 0x6FFE,0xE068, // <cjk> + 0x7001,0xE066, // <cjk> + 0x7009,0xE062, // <cjk> + 0x700B,0xE063, // <cjk> + 0x700F,0xE067, // <cjk> + 0x7011,0xE065, // <cjk> + 0x7015,0x956D, // <cjk> + 0x7018,0xE06D, // <cjk> + 0x701A,0xE06A, // <cjk> + 0x701B,0xE069, // <cjk> + 0x701D,0xE06C, // <cjk> + 0x701E,0x93D2, // <cjk> + 0x701F,0xE06E, // <cjk> + 0x7026,0x9295, // <cjk> + 0x7027,0x91EB, // <cjk> + 0x702C,0x90A3, // <cjk> + 0x7030,0xE06F, // <cjk> + 0x7032,0xE071, // <cjk> + 0x703E,0xE070, // <cjk> + 0x704C,0x9FF3, // <cjk> + 0x7051,0xE072, // <cjk> + 0x7058,0x93E5, // <cjk> + 0x7063,0xE073, // <cjk> + 0x706B,0x89CE, // <cjk> + 0x706F,0x9394, // <cjk> + 0x7070,0x8A44, // <cjk> + 0x7078,0x8B84, // <cjk> + 0x707C,0x8EDC, // <cjk> + 0x707D,0x8DD0, // <cjk> + 0x7089,0x9846, // <cjk> + 0x708A,0x9086, // <cjk> + 0x708E,0x898A, // <cjk> + 0x7092,0xE075, // <cjk> + 0x7099,0xE074, // <cjk> + 0x70AC,0xE078, // <cjk> + 0x70AD,0x9259, // <cjk> + 0x70AE,0xE07B, // <cjk> + 0x70AF,0xE076, // <cjk> + 0x70B3,0xE07A, // <cjk> + 0x70B8,0xE079, // <cjk> + 0x70B9,0x935F, // <cjk> + 0x70BA,0x88D7, // <cjk> + 0x70C8,0x97F3, // <cjk> + 0x70CB,0xE07D, // <cjk> + 0x70CF,0x8947, // <cjk> + 0x70D9,0xE080, // <cjk> + 0x70DD,0xE07E, // <cjk> + 0x70DF,0xE07C, // <cjk> + 0x70F1,0xE077, // <cjk> + 0x70F9,0x9642, // <cjk> + 0x70FD,0xE082, // <cjk> + 0x7109,0xE081, // <cjk> + 0x7114,0x898B, // <cjk> + 0x7119,0xE084, // <cjk> + 0x711A,0x95B0, // <cjk> + 0x711C,0xE083, // <cjk> + 0x7121,0x96B3, // <cjk> + 0x7126,0x8FC5, // <cjk> + 0x7136,0x9152, // <cjk> + 0x713C,0x8FC4, // <cjk> + 0x7149,0x97F9, // <cjk> + 0x714C,0xE08A, // <cjk> + 0x714E,0x90F7, // <cjk> + 0x7155,0xE086, // <cjk> + 0x7156,0xE08B, // <cjk> + 0x7159,0x898C, // <cjk> + 0x7162,0xE089, // <cjk> + 0x7164,0x9481, // <cjk> + 0x7165,0xE085, // <cjk> + 0x7166,0xE088, // <cjk> + 0x7167,0x8FC6, // <cjk> + 0x7169,0x94CF, // <cjk> + 0x716C,0xE08C, // <cjk> + 0x716E,0x8ECF, // <cjk> + 0x717D,0x90F8, // <cjk> + 0x7184,0xE08F, // <cjk> + 0x7188,0xE087, // <cjk> + 0x718A,0x8C46, // <cjk> + 0x718F,0xE08D, // <cjk> + 0x7194,0x976F, // <cjk> + 0x7195,0xE090, // <cjk> + 0x7199,0xEAA4, // <cjk> + 0x719F,0x8F6E, // <cjk> + 0x71A8,0xE091, // <cjk> + 0x71AC,0xE092, // <cjk> + 0x71B1,0x944D, // <cjk> + 0x71B9,0xE094, // <cjk> + 0x71BE,0xE095, // <cjk> + 0x71C3,0x9452, // <cjk> + 0x71C8,0x9395, // <cjk> + 0x71C9,0xE097, // <cjk> + 0x71CE,0xE099, // <cjk> + 0x71D0,0x97D3, // <cjk> + 0x71D2,0xE096, // <cjk> + 0x71D4,0xE098, // <cjk> + 0x71D5,0x898D, // <cjk> + 0x71D7,0xE093, // <cjk> + 0x71DF,0x9A7A, // <cjk> + 0x71E0,0xE09A, // <cjk> + 0x71E5,0x9187, // <cjk> + 0x71E6,0x8E57, // <cjk> + 0x71E7,0xE09C, // <cjk> + 0x71EC,0xE09B, // <cjk> + 0x71ED,0x9043, // <cjk> + 0x71EE,0x99D7, // <cjk> + 0x71F5,0xE09D, // <cjk> + 0x71F9,0xE09F, // <cjk> + 0x71FB,0xE08E, // <cjk> + 0x71FC,0xE09E, // <cjk> + 0x71FF,0xE0A0, // <cjk> + 0x7206,0x949A, // <cjk> + 0x720D,0xE0A1, // <cjk> + 0x7210,0xE0A2, // <cjk> + 0x721B,0xE0A3, // <cjk> + 0x7228,0xE0A4, // <cjk> + 0x722A,0x92DC, // <cjk> + 0x722C,0xE0A6, // <cjk> + 0x722D,0xE0A5, // <cjk> + 0x7230,0xE0A7, // <cjk> + 0x7232,0xE0A8, // <cjk> + 0x7235,0x8EDD, // <cjk> + 0x7236,0x9583, // <cjk> + 0x723A,0x96EA, // <cjk> + 0x723B,0xE0A9, // <cjk> + 0x723C,0xE0AA, // <cjk> + 0x723D,0x9175, // <cjk> + 0x723E,0x8EA2, // <cjk> + 0x723F,0xE0AB, // <cjk> + 0x7240,0xE0AC, // <cjk> + 0x7246,0xE0AD, // <cjk> + 0x7247,0x95D0, // <cjk> + 0x7248,0x94C5, // <cjk> + 0x724B,0xE0AE, // <cjk> + 0x724C,0x9476, // <cjk> + 0x7252,0x92AB, // <cjk> + 0x7258,0xE0AF, // <cjk> + 0x7259,0x89E5, // <cjk> + 0x725B,0x8B8D, // <cjk> + 0x725D,0x96C4, // <cjk> + 0x725F,0x96B4, // <cjk> + 0x7261,0x89B2, // <cjk> + 0x7262,0x9853, // <cjk> + 0x7267,0x9671, // <cjk> + 0x7269,0x95A8, // <cjk> + 0x7272,0x90B5, // <cjk> + 0x7274,0xE0B0, // <cjk> + 0x7279,0x93C1, // <cjk> + 0x727D,0x8CA1, // <cjk> + 0x727E,0xE0B1, // <cjk> + 0x7280,0x8DD2, // <cjk> + 0x7281,0xE0B3, // <cjk> + 0x7282,0xE0B2, // <cjk> + 0x7287,0xE0B4, // <cjk> + 0x7292,0xE0B5, // <cjk> + 0x7296,0xE0B6, // <cjk> + 0x72A0,0x8B5D, // <cjk> + 0x72A2,0xE0B7, // <cjk> + 0x72A7,0xE0B8, // <cjk> + 0x72AC,0x8CA2, // <cjk> + 0x72AF,0x94C6, // <cjk> + 0x72B2,0xE0BA, // <cjk> + 0x72B6,0x8FF3, // <cjk> + 0x72B9,0xE0B9, // <cjk> + 0x72C2,0x8BB6, // <cjk> + 0x72C3,0xE0BB, // <cjk> + 0x72C4,0xE0BD, // <cjk> + 0x72C6,0xE0BC, // <cjk> + 0x72CE,0xE0BE, // <cjk> + 0x72D0,0x8CCF, // <cjk> + 0x72D2,0xE0BF, // <cjk> + 0x72D7,0x8BE7, // <cjk> + 0x72D9,0x915F, // <cjk> + 0x72DB,0x8D9D, // <cjk> + 0x72E0,0xE0C1, // <cjk> + 0x72E1,0xE0C2, // <cjk> + 0x72E2,0xE0C0, // <cjk> + 0x72E9,0x8EEB, // <cjk> + 0x72EC,0x93C6, // <cjk> + 0x72ED,0x8BB7, // <cjk> + 0x72F7,0xE0C4, // <cjk> + 0x72F8,0x924B, // <cjk> + 0x72F9,0xE0C3, // <cjk> + 0x72FC,0x9854, // <cjk> + 0x72FD,0x9482, // <cjk> + 0x730A,0xE0C7, // <cjk> + 0x7316,0xE0C9, // <cjk> + 0x7317,0xE0C6, // <cjk> + 0x731B,0x96D2, // <cjk> + 0x731C,0xE0C8, // <cjk> + 0x731D,0xE0CA, // <cjk> + 0x731F,0x97C2, // <cjk> + 0x7325,0xE0CE, // <cjk> + 0x7329,0xE0CD, // <cjk> + 0x732A,0x9296, // <cjk> + 0x732B,0x944C, // <cjk> + 0x732E,0x8CA3, // <cjk> + 0x732F,0xE0CC, // <cjk> + 0x7334,0xE0CB, // <cjk> + 0x7336,0x9750, // <cjk> + 0x7337,0x9751, // <cjk> + 0x733E,0xE0CF, // <cjk> + 0x733F,0x898E, // <cjk> + 0x7344,0x8D96, // <cjk> + 0x7345,0x8E82, // <cjk> + 0x734E,0xE0D0, // <cjk> + 0x734F,0xE0D1, // <cjk> + 0x7357,0xE0D3, // <cjk> + 0x7363,0x8F62, // <cjk> + 0x7368,0xE0D5, // <cjk> + 0x736A,0xE0D4, // <cjk> + 0x7370,0xE0D6, // <cjk> + 0x7372,0x8A6C, // <cjk> + 0x7375,0xE0D8, // <cjk> + 0x7378,0xE0D7, // <cjk> + 0x737A,0xE0DA, // <cjk> + 0x737B,0xE0D9, // <cjk> + 0x7384,0x8CBA, // <cjk> + 0x7387,0x97A6, // <cjk> + 0x7389,0x8BCA, // <cjk> + 0x738B,0x89A4, // <cjk> + 0x7396,0x8BE8, // <cjk> + 0x73A9,0x8ADF, // <cjk> + 0x73B2,0x97E6, // <cjk> + 0x73B3,0xE0DC, // <cjk> + 0x73BB,0xE0DE, // <cjk> + 0x73C0,0xE0DF, // <cjk> + 0x73C2,0x89CF, // <cjk> + 0x73C8,0xE0DB, // <cjk> + 0x73CA,0x8E58, // <cjk> + 0x73CD,0x92BF, // <cjk> + 0x73CE,0xE0DD, // <cjk> + 0x73DE,0xE0E2, // <cjk> + 0x73E0,0x8EEC, // <cjk> + 0x73E5,0xE0E0, // <cjk> + 0x73EA,0x8C5D, // <cjk> + 0x73ED,0x94C7, // <cjk> + 0x73EE,0xE0E1, // <cjk> + 0x73F1,0xE0FC, // <cjk> + 0x73F8,0xE0E7, // <cjk> + 0x73FE,0x8CBB, // <cjk> + 0x7403,0x8B85, // <cjk> + 0x7405,0xE0E4, // <cjk> + 0x7406,0x979D, // <cjk> + 0x7409,0x97AE, // <cjk> + 0x7422,0x91F4, // <cjk> + 0x7425,0xE0E6, // <cjk> + 0x7432,0xE0E8, // <cjk> + 0x7433,0x97D4, // <cjk> + 0x7434,0x8BD5, // <cjk> + 0x7435,0x94FA, // <cjk> + 0x7436,0x9469, // <cjk> + 0x743A,0xE0E9, // <cjk> + 0x743F,0xE0EB, // <cjk> + 0x7441,0xE0EE, // <cjk> + 0x7455,0xE0EA, // <cjk> + 0x7459,0xE0ED, // <cjk> + 0x745A,0x8CE8, // <cjk> + 0x745B,0x896C, // <cjk> + 0x745C,0xE0EF, // <cjk> + 0x745E,0x9090, // <cjk> + 0x745F,0xE0EC, // <cjk> + 0x7460,0x97DA, // <cjk> + 0x7463,0xE0F2, // <cjk> + 0x7464,0xEAA2, // <cjk> + 0x7469,0xE0F0, // <cjk> + 0x746A,0xE0F3, // <cjk> + 0x746F,0xE0E5, // <cjk> + 0x7470,0xE0F1, // <cjk> + 0x7473,0x8DBA, // <cjk> + 0x7476,0xE0F4, // <cjk> + 0x747E,0xE0F5, // <cjk> + 0x7483,0x979E, // <cjk> + 0x748B,0xE0F6, // <cjk> + 0x749E,0xE0F7, // <cjk> + 0x74A2,0xE0E3, // <cjk> + 0x74A7,0xE0F8, // <cjk> + 0x74B0,0x8AC2, // <cjk> + 0x74BD,0x8EA3, // <cjk> + 0x74CA,0xE0F9, // <cjk> + 0x74CF,0xE0FA, // <cjk> + 0x74D4,0xE0FB, // <cjk> + 0x74DC,0x895A, // <cjk> + 0x74E0,0xE140, // <cjk> + 0x74E2,0x955A, // <cjk> + 0x74E3,0xE141, // <cjk> + 0x74E6,0x8AA2, // <cjk> + 0x74E7,0xE142, // <cjk> + 0x74E9,0xE143, // <cjk> + 0x74EE,0xE144, // <cjk> + 0x74F0,0xE146, // <cjk> + 0x74F1,0xE147, // <cjk> + 0x74F2,0xE145, // <cjk> + 0x74F6,0x9572, // <cjk> + 0x74F7,0xE149, // <cjk> + 0x74F8,0xE148, // <cjk> + 0x7503,0xE14B, // <cjk> + 0x7504,0xE14A, // <cjk> + 0x7505,0xE14C, // <cjk> + 0x750C,0xE14D, // <cjk> + 0x750D,0xE14F, // <cjk> + 0x750E,0xE14E, // <cjk> + 0x7511,0x8D99, // <cjk> + 0x7513,0xE151, // <cjk> + 0x7515,0xE150, // <cjk> + 0x7518,0x8AC3, // <cjk> + 0x751A,0x9072, // <cjk> + 0x751E,0xE152, // <cjk> + 0x751F,0x90B6, // <cjk> + 0x7523,0x8E59, // <cjk> + 0x7525,0x8999, // <cjk> + 0x7526,0xE153, // <cjk> + 0x7528,0x9770, // <cjk> + 0x752B,0x95E1, // <cjk> + 0x752C,0xE154, // <cjk> + 0x7530,0x9363, // <cjk> + 0x7531,0x9752, // <cjk> + 0x7532,0x8D62, // <cjk> + 0x7533,0x905C, // <cjk> + 0x7537,0x926A, // <cjk> + 0x7538,0x99B2, // <cjk> + 0x753A,0x92AC, // <cjk> + 0x753B,0x89E6, // <cjk> + 0x753C,0xE155, // <cjk> + 0x7544,0xE156, // <cjk> + 0x7549,0xE159, // <cjk> + 0x754A,0xE158, // <cjk> + 0x754B,0x9DC0, // <cjk> + 0x754C,0x8A45, // <cjk> + 0x754D,0xE157, // <cjk> + 0x754F,0x88D8, // <cjk> + 0x7551,0x94A8, // <cjk> + 0x7554,0x94C8, // <cjk> + 0x7559,0x97AF, // <cjk> + 0x755A,0xE15C, // <cjk> + 0x755B,0xE15A, // <cjk> + 0x755C,0x927B, // <cjk> + 0x755D,0x90A4, // <cjk> + 0x7560,0x94A9, // <cjk> + 0x7562,0x954C, // <cjk> + 0x7564,0xE15E, // <cjk> + 0x7565,0x97AA, // <cjk> + 0x7566,0x8C6C, // <cjk> + 0x7567,0xE15F, // <cjk> + 0x7569,0xE15D, // <cjk> + 0x756A,0x94D4, // <cjk> + 0x756B,0xE160, // <cjk> + 0x756D,0xE161, // <cjk> + 0x7570,0x88D9, // <cjk> + 0x7573,0x8FF4, // <cjk> + 0x7574,0xE166, // <cjk> + 0x7576,0xE163, // <cjk> + 0x7577,0x93EB, // <cjk> + 0x7578,0xE162, // <cjk> + 0x757F,0x8B45, // <cjk> + 0x7582,0xE169, // <cjk> + 0x7586,0xE164, // <cjk> + 0x7587,0xE165, // <cjk> + 0x7589,0xE168, // <cjk> + 0x758A,0xE167, // <cjk> + 0x758B,0x9544, // <cjk> + 0x758E,0x9161, // <cjk> + 0x758F,0x9160, // <cjk> + 0x7591,0x8B5E, // <cjk> + 0x7594,0xE16A, // <cjk> + 0x759A,0xE16B, // <cjk> + 0x759D,0xE16C, // <cjk> + 0x75A3,0xE16E, // <cjk> + 0x75A5,0xE16D, // <cjk> + 0x75AB,0x8975, // <cjk> + 0x75B1,0xE176, // <cjk> + 0x75B2,0x94E6, // <cjk> + 0x75B3,0xE170, // <cjk> + 0x75B5,0xE172, // <cjk> + 0x75B8,0xE174, // <cjk> + 0x75B9,0x905D, // <cjk> + 0x75BC,0xE175, // <cjk> + 0x75BD,0xE173, // <cjk> + 0x75BE,0x8EBE, // <cjk> + 0x75C2,0xE16F, // <cjk> + 0x75C3,0xE171, // <cjk> + 0x75C5,0x9561, // <cjk> + 0x75C7,0x8FC7, // <cjk> + 0x75CA,0xE178, // <cjk> + 0x75CD,0xE177, // <cjk> + 0x75D2,0xE179, // <cjk> + 0x75D4,0x8EA4, // <cjk> + 0x75D5,0x8DAD, // <cjk> + 0x75D8,0x9397, // <cjk> + 0x75D9,0xE17A, // <cjk> + 0x75DB,0x92C9, // <cjk> + 0x75DE,0xE17C, // <cjk> + 0x75E2,0x979F, // <cjk> + 0x75E3,0xE17B, // <cjk> + 0x75E9,0x9189, // <cjk> + 0x75F0,0xE182, // <cjk> + 0x75F2,0xE184, // <cjk> + 0x75F3,0xE185, // <cjk> + 0x75F4,0x9273, // <cjk> + 0x75FA,0xE183, // <cjk> + 0x75FC,0xE180, // <cjk> + 0x75FE,0xE17D, // <cjk> + 0x75FF,0xE17E, // <cjk> + 0x7601,0xE181, // <cjk> + 0x7609,0xE188, // <cjk> + 0x760B,0xE186, // <cjk> + 0x760D,0xE187, // <cjk> + 0x761F,0xE189, // <cjk> + 0x7620,0xE18B, // <cjk> + 0x7621,0xE18C, // <cjk> + 0x7622,0xE18D, // <cjk> + 0x7624,0xE18E, // <cjk> + 0x7627,0xE18A, // <cjk> + 0x7630,0xE190, // <cjk> + 0x7634,0xE18F, // <cjk> + 0x763B,0xE191, // <cjk> + 0x7642,0x97C3, // <cjk> + 0x7646,0xE194, // <cjk> + 0x7647,0xE192, // <cjk> + 0x7648,0xE193, // <cjk> + 0x764C,0x8AE0, // <cjk> + 0x7652,0x96FC, // <cjk> + 0x7656,0x95C8, // <cjk> + 0x7658,0xE196, // <cjk> + 0x765C,0xE195, // <cjk> + 0x7661,0xE197, // <cjk> + 0x7662,0xE198, // <cjk> + 0x7667,0xE19C, // <cjk> + 0x7668,0xE199, // <cjk> + 0x7669,0xE19A, // <cjk> + 0x766A,0xE19B, // <cjk> + 0x766C,0xE19D, // <cjk> + 0x7670,0xE19E, // <cjk> + 0x7672,0xE19F, // <cjk> + 0x7676,0xE1A0, // <cjk> + 0x7678,0xE1A1, // <cjk> + 0x767A,0x94AD, // <cjk> + 0x767B,0x936F, // <cjk> + 0x767C,0xE1A2, // <cjk> + 0x767D,0x9492, // <cjk> + 0x767E,0x9553, // <cjk> + 0x7680,0xE1A3, // <cjk> + 0x7683,0xE1A4, // <cjk> + 0x7684,0x9349, // <cjk> + 0x7686,0x8A46, // <cjk> + 0x7687,0x8D63, // <cjk> + 0x7688,0xE1A5, // <cjk> + 0x768B,0xE1A6, // <cjk> + 0x768E,0xE1A7, // <cjk> + 0x7690,0x8E48, // <cjk> + 0x7693,0xE1A9, // <cjk> + 0x7696,0xE1A8, // <cjk> + 0x7699,0xE1AA, // <cjk> + 0x769A,0xE1AB, // <cjk> + 0x76AE,0x94E7, // <cjk> + 0x76B0,0xE1AC, // <cjk> + 0x76B4,0xE1AD, // <cjk> + 0x76B7,0xEA89, // <cjk> + 0x76B8,0xE1AE, // <cjk> + 0x76B9,0xE1AF, // <cjk> + 0x76BA,0xE1B0, // <cjk> + 0x76BF,0x8E4D, // <cjk> + 0x76C2,0xE1B1, // <cjk> + 0x76C3,0x9475, // <cjk> + 0x76C6,0x967E, // <cjk> + 0x76C8,0x896D, // <cjk> + 0x76CA,0x8976, // <cjk> + 0x76CD,0xE1B2, // <cjk> + 0x76D2,0xE1B4, // <cjk> + 0x76D6,0xE1B3, // <cjk> + 0x76D7,0x9390, // <cjk> + 0x76DB,0x90B7, // <cjk> + 0x76DC,0x9F58, // <cjk> + 0x76DE,0xE1B5, // <cjk> + 0x76DF,0x96BF, // <cjk> + 0x76E1,0xE1B6, // <cjk> + 0x76E3,0x8AC4, // <cjk> + 0x76E4,0x94D5, // <cjk> + 0x76E5,0xE1B7, // <cjk> + 0x76E7,0xE1B8, // <cjk> + 0x76EA,0xE1B9, // <cjk> + 0x76EE,0x96DA, // <cjk> + 0x76F2,0x96D3, // <cjk> + 0x76F4,0x92BC, // <cjk> + 0x76F8,0x918A, // <cjk> + 0x76FB,0xE1BB, // <cjk> + 0x76FE,0x8F82, // <cjk> + 0x7701,0x8FC8, // <cjk> + 0x7704,0xE1BE, // <cjk> + 0x7707,0xE1BD, // <cjk> + 0x7708,0xE1BC, // <cjk> + 0x7709,0x94FB, // <cjk> + 0x770B,0x8AC5, // <cjk> + 0x770C,0x8CA7, // <cjk> + 0x771B,0xE1C4, // <cjk> + 0x771E,0xE1C1, // <cjk> + 0x771F,0x905E, // <cjk> + 0x7720,0x96B0, // <cjk> + 0x7724,0xE1C0, // <cjk> + 0x7725,0xE1C2, // <cjk> + 0x7726,0xE1C3, // <cjk> + 0x7729,0xE1BF, // <cjk> + 0x7737,0xE1C5, // <cjk> + 0x7738,0xE1C6, // <cjk> + 0x773A,0x92AD, // <cjk> + 0x773C,0x8AE1, // <cjk> + 0x7740,0x9285, // <cjk> + 0x7747,0xE1C7, // <cjk> + 0x775A,0xE1C8, // <cjk> + 0x775B,0xE1CB, // <cjk> + 0x7761,0x9087, // <cjk> + 0x7763,0x93C2, // <cjk> + 0x7765,0xE1CC, // <cjk> + 0x7766,0x9672, // <cjk> + 0x7768,0xE1C9, // <cjk> + 0x776B,0xE1CA, // <cjk> + 0x7779,0xE1CF, // <cjk> + 0x777E,0xE1CE, // <cjk> + 0x777F,0xE1CD, // <cjk> + 0x778B,0xE1D1, // <cjk> + 0x778E,0xE1D0, // <cjk> + 0x7791,0xE1D2, // <cjk> + 0x779E,0xE1D4, // <cjk> + 0x77A0,0xE1D3, // <cjk> + 0x77A5,0x95CB, // <cjk> + 0x77AC,0x8F75, // <cjk> + 0x77AD,0x97C4, // <cjk> + 0x77B0,0xE1D5, // <cjk> + 0x77B3,0x93B5, // <cjk> + 0x77B6,0xE1D6, // <cjk> + 0x77B9,0xE1D7, // <cjk> + 0x77BB,0xE1DB, // <cjk> + 0x77BC,0xE1D9, // <cjk> + 0x77BD,0xE1DA, // <cjk> + 0x77BF,0xE1D8, // <cjk> + 0x77C7,0xE1DC, // <cjk> + 0x77CD,0xE1DD, // <cjk> + 0x77D7,0xE1DE, // <cjk> + 0x77DA,0xE1DF, // <cjk> + 0x77DB,0x96B5, // <cjk> + 0x77DC,0xE1E0, // <cjk> + 0x77E2,0x96EE, // <cjk> + 0x77E3,0xE1E1, // <cjk> + 0x77E5,0x926D, // <cjk> + 0x77E7,0x948A, // <cjk> + 0x77E9,0x8BE9, // <cjk> + 0x77ED,0x925A, // <cjk> + 0x77EE,0xE1E2, // <cjk> + 0x77EF,0x8BB8, // <cjk> + 0x77F3,0x90CE, // <cjk> + 0x77FC,0xE1E3, // <cjk> + 0x7802,0x8DBB, // <cjk> + 0x780C,0xE1E4, // <cjk> + 0x7812,0xE1E5, // <cjk> + 0x7814,0x8CA4, // <cjk> + 0x7815,0x8DD3, // <cjk> + 0x7820,0xE1E7, // <cjk> + 0x7825,0x9375, // <cjk> + 0x7826,0x8DD4, // <cjk> + 0x7827,0x8B6D, // <cjk> + 0x7832,0x9643, // <cjk> + 0x7834,0x946A, // <cjk> + 0x783A,0x9376, // <cjk> + 0x783F,0x8D7B, // <cjk> + 0x7845,0xE1E9, // <cjk> + 0x785D,0x8FC9, // <cjk> + 0x786B,0x97B0, // <cjk> + 0x786C,0x8D64, // <cjk> + 0x786F,0x8CA5, // <cjk> + 0x7872,0x94A1, // <cjk> + 0x7874,0xE1EB, // <cjk> + 0x787C,0xE1ED, // <cjk> + 0x7881,0x8CE9, // <cjk> + 0x7886,0xE1EC, // <cjk> + 0x7887,0x92F4, // <cjk> + 0x788C,0xE1EF, // <cjk> + 0x788D,0x8A56, // <cjk> + 0x788E,0xE1EA, // <cjk> + 0x7891,0x94E8, // <cjk> + 0x7893,0x894F, // <cjk> + 0x7895,0x8DEA, // <cjk> + 0x7897,0x9871, // <cjk> + 0x789A,0xE1EE, // <cjk> + 0x78A3,0xE1F0, // <cjk> + 0x78A7,0x95C9, // <cjk> + 0x78A9,0x90D7, // <cjk> + 0x78AA,0xE1F2, // <cjk> + 0x78AF,0xE1F3, // <cjk> + 0x78B5,0xE1F1, // <cjk> + 0x78BA,0x8A6D, // <cjk> + 0x78BC,0xE1F9, // <cjk> + 0x78BE,0xE1F8, // <cjk> + 0x78C1,0x8EA5, // <cjk> + 0x78C5,0xE1FA, // <cjk> + 0x78C6,0xE1F5, // <cjk> + 0x78CA,0xE1FB, // <cjk> + 0x78CB,0xE1F6, // <cjk> + 0x78D0,0x94D6, // <cjk> + 0x78D1,0xE1F4, // <cjk> + 0x78D4,0xE1F7, // <cjk> + 0x78DA,0xE241, // <cjk> + 0x78E7,0xE240, // <cjk> + 0x78E8,0x9681, // <cjk> + 0x78EC,0xE1FC, // <cjk> + 0x78EF,0x88E9, // <cjk> + 0x78F4,0xE243, // <cjk> + 0x78FD,0xE242, // <cjk> + 0x7901,0x8FCA, // <cjk> + 0x7907,0xE244, // <cjk> + 0x790E,0x9162, // <cjk> + 0x7911,0xE246, // <cjk> + 0x7912,0xE245, // <cjk> + 0x7919,0xE247, // <cjk> + 0x7926,0xE1E6, // <cjk> + 0x792A,0xE1E8, // <cjk> + 0x792B,0xE249, // <cjk> + 0x792C,0xE248, // <cjk> + 0x793A,0x8EA6, // <cjk> + 0x793C,0x97E7, // <cjk> + 0x793E,0x8ED0, // <cjk> + 0x7940,0xE24A, // <cjk> + 0x7941,0x8C56, // <cjk> + 0x7947,0x8B5F, // <cjk> + 0x7948,0x8B46, // <cjk> + 0x7949,0x8E83, // <cjk> + 0x7950,0x9753, // <cjk> + 0x7953,0xE250, // <cjk> + 0x7955,0xE24F, // <cjk> + 0x7956,0x9163, // <cjk> + 0x7957,0xE24C, // <cjk> + 0x795A,0xE24E, // <cjk> + 0x795D,0x8F6A, // <cjk> + 0x795E,0x905F, // <cjk> + 0x795F,0xE24D, // <cjk> + 0x7960,0xE24B, // <cjk> + 0x7962,0x9449, // <cjk> + 0x7965,0x8FCB, // <cjk> + 0x796D,0x8DD5, // <cjk> + 0x7977,0x9398, // <cjk> + 0x797A,0xE251, // <cjk> + 0x797F,0xE252, // <cjk> + 0x7980,0xE268, // <cjk> + 0x7981,0x8BD6, // <cjk> + 0x7984,0x985C, // <cjk> + 0x7985,0x9154, // <cjk> + 0x798A,0xE253, // <cjk> + 0x798D,0x89D0, // <cjk> + 0x798E,0x92F5, // <cjk> + 0x798F,0x959F, // <cjk> + 0x799D,0xE254, // <cjk> + 0x79A6,0x8B9A, // <cjk> + 0x79A7,0xE255, // <cjk> + 0x79AA,0xE257, // <cjk> + 0x79AE,0xE258, // <cjk> + 0x79B0,0x9448, // <cjk> + 0x79B3,0xE259, // <cjk> + 0x79B9,0xE25A, // <cjk> + 0x79BD,0x8BD7, // <cjk> + 0x79BE,0x89D1, // <cjk> + 0x79BF,0x93C3, // <cjk> + 0x79C0,0x8F47, // <cjk> + 0x79C1,0x8E84, // <cjk> + 0x79C9,0xE25C, // <cjk> + 0x79CB,0x8F48, // <cjk> + 0x79D1,0x89C8, // <cjk> + 0x79D2,0x9562, // <cjk> + 0x79D5,0xE25D, // <cjk> + 0x79D8,0x94E9, // <cjk> + 0x79DF,0x9164, // <cjk> + 0x79E1,0xE260, // <cjk> + 0x79E3,0xE261, // <cjk> + 0x79E4,0x9489, // <cjk> + 0x79E6,0x9060, // <cjk> + 0x79E7,0xE25E, // <cjk> + 0x79E9,0x9281, // <cjk> + 0x79EC,0xE25F, // <cjk> + 0x79F0,0x8FCC, // <cjk> + 0x79FB,0x88DA, // <cjk> + 0x7A00,0x8B48, // <cjk> + 0x7A08,0xE262, // <cjk> + 0x7A0B,0x92F6, // <cjk> + 0x7A0D,0xE263, // <cjk> + 0x7A0E,0x90C5, // <cjk> + 0x7A14,0x96AB, // <cjk> + 0x7A17,0x9542, // <cjk> + 0x7A18,0xE264, // <cjk> + 0x7A19,0xE265, // <cjk> + 0x7A1A,0x9274, // <cjk> + 0x7A1C,0x97C5, // <cjk> + 0x7A1F,0xE267, // <cjk> + 0x7A20,0xE266, // <cjk> + 0x7A2E,0x8EED, // <cjk> + 0x7A31,0xE269, // <cjk> + 0x7A32,0x88EE, // <cjk> + 0x7A37,0xE26C, // <cjk> + 0x7A3B,0xE26A, // <cjk> + 0x7A3C,0x89D2, // <cjk> + 0x7A3D,0x8C6D, // <cjk> + 0x7A3E,0xE26B, // <cjk> + 0x7A3F,0x8D65, // <cjk> + 0x7A40,0x8D92, // <cjk> + 0x7A42,0x95E4, // <cjk> + 0x7A43,0xE26D, // <cjk> + 0x7A46,0x9673, // <cjk> + 0x7A49,0xE26F, // <cjk> + 0x7A4D,0x90CF, // <cjk> + 0x7A4E,0x896E, // <cjk> + 0x7A4F,0x89B8, // <cjk> + 0x7A50,0x88AA, // <cjk> + 0x7A57,0xE26E, // <cjk> + 0x7A61,0xE270, // <cjk> + 0x7A62,0xE271, // <cjk> + 0x7A63,0x8FF5, // <cjk> + 0x7A69,0xE272, // <cjk> + 0x7A6B,0x8A6E, // <cjk> + 0x7A70,0xE274, // <cjk> + 0x7A74,0x8C8A, // <cjk> + 0x7A76,0x8B86, // <cjk> + 0x7A79,0xE275, // <cjk> + 0x7A7A,0x8BF3, // <cjk> + 0x7A7D,0xE276, // <cjk> + 0x7A7F,0x90FA, // <cjk> + 0x7A81,0x93CB, // <cjk> + 0x7A83,0x90DE, // <cjk> + 0x7A84,0x8DF3, // <cjk> + 0x7A88,0xE277, // <cjk> + 0x7A92,0x9282, // <cjk> + 0x7A93,0x918B, // <cjk> + 0x7A95,0xE279, // <cjk> + 0x7A96,0xE27B, // <cjk> + 0x7A97,0xE278, // <cjk> + 0x7A98,0xE27A, // <cjk> + 0x7A9F,0x8C41, // <cjk> + 0x7AA9,0xE27C, // <cjk> + 0x7AAA,0x8C45, // <cjk> + 0x7AAE,0x8B87, // <cjk> + 0x7AAF,0x9771, // <cjk> + 0x7AB0,0xE27E, // <cjk> + 0x7AB6,0xE280, // <cjk> + 0x7ABA,0x894D, // <cjk> + 0x7ABF,0xE283, // <cjk> + 0x7AC3,0x8A96, // <cjk> + 0x7AC4,0xE282, // <cjk> + 0x7AC5,0xE281, // <cjk> + 0x7AC7,0xE285, // <cjk> + 0x7AC8,0xE27D, // <cjk> + 0x7ACA,0xE286, // <cjk> + 0x7ACB,0x97A7, // <cjk> + 0x7ACD,0xE287, // <cjk> + 0x7ACF,0xE288, // <cjk> + 0x7AD2,0x9AF2, // <cjk> + 0x7AD3,0xE28A, // <cjk> + 0x7AD5,0xE289, // <cjk> + 0x7AD9,0xE28B, // <cjk> + 0x7ADA,0xE28C, // <cjk> + 0x7ADC,0x97B3, // <cjk> + 0x7ADD,0xE28D, // <cjk> + 0x7ADF,0xE8ED, // <cjk> + 0x7AE0,0x8FCD, // <cjk> + 0x7AE1,0xE28E, // <cjk> + 0x7AE2,0xE28F, // <cjk> + 0x7AE3,0x8F76, // <cjk> + 0x7AE5,0x93B6, // <cjk> + 0x7AE6,0xE290, // <cjk> + 0x7AEA,0x9247, // <cjk> + 0x7AED,0xE291, // <cjk> + 0x7AF0,0xE292, // <cjk> + 0x7AF6,0x8BA3, // <cjk> + 0x7AF8,0x995E, // <cjk> + 0x7AF9,0x927C, // <cjk> + 0x7AFA,0x8EB1, // <cjk> + 0x7AFF,0x8AC6, // <cjk> + 0x7B02,0xE293, // <cjk> + 0x7B04,0xE2A0, // <cjk> + 0x7B06,0xE296, // <cjk> + 0x7B08,0x8B88, // <cjk> + 0x7B0A,0xE295, // <cjk> + 0x7B0B,0xE2A2, // <cjk> + 0x7B0F,0xE294, // <cjk> + 0x7B11,0x8FCE, // <cjk> + 0x7B18,0xE298, // <cjk> + 0x7B19,0xE299, // <cjk> + 0x7B1B,0x934A, // <cjk> + 0x7B1E,0xE29A, // <cjk> + 0x7B20,0x8A7D, // <cjk> + 0x7B25,0x9079, // <cjk> + 0x7B26,0x9584, // <cjk> + 0x7B28,0xE29C, // <cjk> + 0x7B2C,0x91E6, // <cjk> + 0x7B33,0xE297, // <cjk> + 0x7B35,0xE29B, // <cjk> + 0x7B36,0xE29D, // <cjk> + 0x7B39,0x8DF9, // <cjk> + 0x7B45,0xE2A4, // <cjk> + 0x7B46,0x954D, // <cjk> + 0x7B48,0x94A4, // <cjk> + 0x7B49,0x9399, // <cjk> + 0x7B4B,0x8BD8, // <cjk> + 0x7B4C,0xE2A3, // <cjk> + 0x7B4D,0xE2A1, // <cjk> + 0x7B4F,0x94B3, // <cjk> + 0x7B50,0xE29E, // <cjk> + 0x7B51,0x927D, // <cjk> + 0x7B52,0x939B, // <cjk> + 0x7B54,0x939A, // <cjk> + 0x7B56,0x8DF4, // <cjk> + 0x7B5D,0xE2B6, // <cjk> + 0x7B65,0xE2A6, // <cjk> + 0x7B67,0xE2A8, // <cjk> + 0x7B6C,0xE2AB, // <cjk> + 0x7B6E,0xE2AC, // <cjk> + 0x7B70,0xE2A9, // <cjk> + 0x7B71,0xE2AA, // <cjk> + 0x7B74,0xE2A7, // <cjk> + 0x7B75,0xE2A5, // <cjk> + 0x7B7A,0xE29F, // <cjk> + 0x7B86,0x95CD, // <cjk> + 0x7B87,0x89D3, // <cjk> + 0x7B8B,0xE2B3, // <cjk> + 0x7B8D,0xE2B0, // <cjk> + 0x7B8F,0xE2B5, // <cjk> + 0x7B92,0xE2B4, // <cjk> + 0x7B94,0x9493, // <cjk> + 0x7B95,0x96A5, // <cjk> + 0x7B97,0x8E5A, // <cjk> + 0x7B98,0xE2AE, // <cjk> + 0x7B99,0xE2B7, // <cjk> + 0x7B9A,0xE2B2, // <cjk> + 0x7B9C,0xE2B1, // <cjk> + 0x7B9D,0xE2AD, // <cjk> + 0x7B9F,0xE2AF, // <cjk> + 0x7BA1,0x8AC7, // <cjk> + 0x7BAA,0x925C, // <cjk> + 0x7BAD,0x90FB, // <cjk> + 0x7BB1,0x94A0, // <cjk> + 0x7BB4,0xE2BC, // <cjk> + 0x7BB8,0x94A2, // <cjk> + 0x7BC0,0x90DF, // <cjk> + 0x7BC1,0xE2B9, // <cjk> + 0x7BC4,0x94CD, // <cjk> + 0x7BC6,0xE2BD, // <cjk> + 0x7BC7,0x95D1, // <cjk> + 0x7BC9,0x927A, // <cjk> + 0x7BCB,0xE2B8, // <cjk> + 0x7BCC,0xE2BA, // <cjk> + 0x7BCF,0xE2BB, // <cjk> + 0x7BDD,0xE2BE, // <cjk> + 0x7BE0,0x8EC2, // <cjk> + 0x7BE4,0x93C4, // <cjk> + 0x7BE5,0xE2C3, // <cjk> + 0x7BE6,0xE2C2, // <cjk> + 0x7BE9,0xE2BF, // <cjk> + 0x7BED,0x9855, // <cjk> + 0x7BF3,0xE2C8, // <cjk> + 0x7BF6,0xE2CC, // <cjk> + 0x7BF7,0xE2C9, // <cjk> + 0x7C00,0xE2C5, // <cjk> + 0x7C07,0xE2C6, // <cjk> + 0x7C0D,0xE2CB, // <cjk> + 0x7C11,0xE2C0, // <cjk> + 0x7C12,0x99D3, // <cjk> + 0x7C13,0xE2C7, // <cjk> + 0x7C14,0xE2C1, // <cjk> + 0x7C17,0xE2CA, // <cjk> + 0x7C1F,0xE2D0, // <cjk> + 0x7C21,0x8AC8, // <cjk> + 0x7C23,0xE2CD, // <cjk> + 0x7C27,0xE2CE, // <cjk> + 0x7C2A,0xE2CF, // <cjk> + 0x7C2B,0xE2D2, // <cjk> + 0x7C37,0xE2D1, // <cjk> + 0x7C38,0x94F4, // <cjk> + 0x7C3D,0xE2D3, // <cjk> + 0x7C3E,0x97FA, // <cjk> + 0x7C3F,0x95EB, // <cjk> + 0x7C40,0xE2D8, // <cjk> + 0x7C43,0xE2D5, // <cjk> + 0x7C4C,0xE2D4, // <cjk> + 0x7C4D,0x90D0, // <cjk> + 0x7C4F,0xE2D7, // <cjk> + 0x7C50,0xE2D9, // <cjk> + 0x7C54,0xE2D6, // <cjk> + 0x7C56,0xE2DD, // <cjk> + 0x7C58,0xE2DA, // <cjk> + 0x7C5F,0xE2DB, // <cjk> + 0x7C60,0xE2C4, // <cjk> + 0x7C64,0xE2DC, // <cjk> + 0x7C65,0xE2DE, // <cjk> + 0x7C6C,0xE2DF, // <cjk> + 0x7C73,0x95C4, // <cjk> + 0x7C75,0xE2E0, // <cjk> + 0x7C7E,0x96E0, // <cjk> + 0x7C81,0x8BCC, // <cjk> + 0x7C82,0x8C48, // <cjk> + 0x7C83,0xE2E1, // <cjk> + 0x7C89,0x95B2, // <cjk> + 0x7C8B,0x9088, // <cjk> + 0x7C8D,0x96AE, // <cjk> + 0x7C90,0xE2E2, // <cjk> + 0x7C92,0x97B1, // <cjk> + 0x7C95,0x9494, // <cjk> + 0x7C97,0x9165, // <cjk> + 0x7C98,0x9453, // <cjk> + 0x7C9B,0x8F6C, // <cjk> + 0x7C9F,0x88BE, // <cjk> + 0x7CA1,0xE2E7, // <cjk> + 0x7CA2,0xE2E5, // <cjk> + 0x7CA4,0xE2E3, // <cjk> + 0x7CA5,0x8A9F, // <cjk> + 0x7CA7,0x8FCF, // <cjk> + 0x7CA8,0xE2E8, // <cjk> + 0x7CAB,0xE2E6, // <cjk> + 0x7CAD,0xE2E4, // <cjk> + 0x7CAE,0xE2EC, // <cjk> + 0x7CB1,0xE2EB, // <cjk> + 0x7CB2,0xE2EA, // <cjk> + 0x7CB3,0xE2E9, // <cjk> + 0x7CB9,0xE2ED, // <cjk> + 0x7CBD,0xE2EE, // <cjk> + 0x7CBE,0x90B8, // <cjk> + 0x7CC0,0xE2EF, // <cjk> + 0x7CC2,0xE2F1, // <cjk> + 0x7CC5,0xE2F0, // <cjk> + 0x7CCA,0x8CD0, // <cjk> + 0x7CCE,0x9157, // <cjk> + 0x7CD2,0xE2F3, // <cjk> + 0x7CD6,0x939C, // <cjk> + 0x7CD8,0xE2F2, // <cjk> + 0x7CDC,0xE2F4, // <cjk> + 0x7CDE,0x95B3, // <cjk> + 0x7CDF,0x918C, // <cjk> + 0x7CE0,0x8D66, // <cjk> + 0x7CE2,0xE2F5, // <cjk> + 0x7CE7,0x97C6, // <cjk> + 0x7CEF,0xE2F7, // <cjk> + 0x7CF2,0xE2F8, // <cjk> + 0x7CF4,0xE2F9, // <cjk> + 0x7CF6,0xE2FA, // <cjk> + 0x7CF8,0x8E85, // <cjk> + 0x7CFA,0xE2FB, // <cjk> + 0x7CFB,0x8C6E, // <cjk> + 0x7CFE,0x8B8A, // <cjk> + 0x7D00,0x8B49, // <cjk> + 0x7D02,0xE340, // <cjk> + 0x7D04,0x96F1, // <cjk> + 0x7D05,0x8D67, // <cjk> + 0x7D06,0xE2FC, // <cjk> + 0x7D0A,0xE343, // <cjk> + 0x7D0B,0x96E4, // <cjk> + 0x7D10,0x9552, // <cjk> + 0x7D14,0x8F83, // <cjk> + 0x7D15,0xE342, // <cjk> + 0x7D17,0x8ED1, // <cjk> + 0x7D18,0x8D68, // <cjk> + 0x7D19,0x8E86, // <cjk> + 0x7D1A,0x8B89, // <cjk> + 0x7D1B,0x95B4, // <cjk> + 0x7D1C,0xE341, // <cjk> + 0x7D20,0x9166, // <cjk> + 0x7D21,0x9661, // <cjk> + 0x7D22,0x8DF5, // <cjk> + 0x7D2B,0x8E87, // <cjk> + 0x7D2C,0x92DB, // <cjk> + 0x7D2E,0xE346, // <cjk> + 0x7D2F,0x97DD, // <cjk> + 0x7D30,0x8DD7, // <cjk> + 0x7D32,0xE347, // <cjk> + 0x7D33,0x9061, // <cjk> + 0x7D35,0xE349, // <cjk> + 0x7D39,0x8FD0, // <cjk> + 0x7D3A,0x8DAE, // <cjk> + 0x7D3F,0xE348, // <cjk> + 0x7D42,0x8F49, // <cjk> + 0x7D43,0x8CBC, // <cjk> + 0x7D44,0x9167, // <cjk> + 0x7D45,0xE344, // <cjk> + 0x7D46,0xE34A, // <cjk> + 0x7D4B,0xE345, // <cjk> + 0x7D4C,0x8C6F, // <cjk> + 0x7D4E,0xE34D, // <cjk> + 0x7D4F,0xE351, // <cjk> + 0x7D50,0x8C8B, // <cjk> + 0x7D56,0xE34C, // <cjk> + 0x7D5B,0xE355, // <cjk> + 0x7D5E,0x8D69, // <cjk> + 0x7D61,0x978D, // <cjk> + 0x7D62,0x88BA, // <cjk> + 0x7D63,0xE352, // <cjk> + 0x7D66,0x8B8B, // <cjk> + 0x7D68,0xE34F, // <cjk> + 0x7D6E,0xE350, // <cjk> + 0x7D71,0x939D, // <cjk> + 0x7D72,0xE34E, // <cjk> + 0x7D73,0xE34B, // <cjk> + 0x7D75,0x8A47, // <cjk> + 0x7D76,0x90E2, // <cjk> + 0x7D79,0x8CA6, // <cjk> + 0x7D7D,0xE357, // <cjk> + 0x7D89,0xE354, // <cjk> + 0x7D8F,0xE356, // <cjk> + 0x7D93,0xE353, // <cjk> + 0x7D99,0x8C70, // <cjk> + 0x7D9A,0x91B1, // <cjk> + 0x7D9B,0xE358, // <cjk> + 0x7D9C,0x918E, // <cjk> + 0x7D9F,0xE365, // <cjk> + 0x7DA2,0xE361, // <cjk> + 0x7DAB,0xE35F, // <cjk> + 0x7DAC,0x8EF8, // <cjk> + 0x7DAD,0x88DB, // <cjk> + 0x7DAE,0xE35A, // <cjk> + 0x7DAF,0xE362, // <cjk> + 0x7DB0,0xE366, // <cjk> + 0x7DB1,0x8D6A, // <cjk> + 0x7DB2,0x96D4, // <cjk> + 0x7DB4,0x92D4, // <cjk> + 0x7DB5,0xE35C, // <cjk> + 0x7DB8,0xE364, // <cjk> + 0x7DBA,0xE359, // <cjk> + 0x7DBB,0x925D, // <cjk> + 0x7DBD,0xE35E, // <cjk> + 0x7DBE,0x88BB, // <cjk> + 0x7DBF,0x96C8, // <cjk> + 0x7DC7,0xE35D, // <cjk> + 0x7DCA,0x8BD9, // <cjk> + 0x7DCB,0x94EA, // <cjk> + 0x7DCF,0x918D, // <cjk> + 0x7DD1,0x97CE, // <cjk> + 0x7DD2,0x8F8F, // <cjk> + 0x7DD5,0xE38E, // <cjk> + 0x7DD8,0xE367, // <cjk> + 0x7DDA,0x90FC, // <cjk> + 0x7DDC,0xE363, // <cjk> + 0x7DDD,0xE368, // <cjk> + 0x7DDE,0xE36A, // <cjk> + 0x7DE0,0x92F7, // <cjk> + 0x7DE1,0xE36D, // <cjk> + 0x7DE4,0xE369, // <cjk> + 0x7DE8,0x95D2, // <cjk> + 0x7DE9,0x8AC9, // <cjk> + 0x7DEC,0x96C9, // <cjk> + 0x7DEF,0x88DC, // <cjk> + 0x7DF2,0xE36C, // <cjk> + 0x7DF4,0x97FB, // <cjk> + 0x7DFB,0xE36B, // <cjk> + 0x7E01,0x898F, // <cjk> + 0x7E04,0x93EA, // <cjk> + 0x7E05,0xE36E, // <cjk> + 0x7E09,0xE375, // <cjk> + 0x7E0A,0xE36F, // <cjk> + 0x7E0B,0xE376, // <cjk> + 0x7E12,0xE372, // <cjk> + 0x7E1B,0x949B, // <cjk> + 0x7E1E,0x8EC8, // <cjk> + 0x7E1F,0xE374, // <cjk> + 0x7E21,0xE371, // <cjk> + 0x7E22,0xE377, // <cjk> + 0x7E23,0xE370, // <cjk> + 0x7E26,0x8F63, // <cjk> + 0x7E2B,0x9644, // <cjk> + 0x7E2E,0x8F6B, // <cjk> + 0x7E31,0xE373, // <cjk> + 0x7E32,0xE380, // <cjk> + 0x7E35,0xE37B, // <cjk> + 0x7E37,0xE37E, // <cjk> + 0x7E39,0xE37C, // <cjk> + 0x7E3A,0xE381, // <cjk> + 0x7E3B,0xE37A, // <cjk> + 0x7E3D,0xE360, // <cjk> + 0x7E3E,0x90D1, // <cjk> + 0x7E41,0x94C9, // <cjk> + 0x7E43,0xE37D, // <cjk> + 0x7E46,0xE378, // <cjk> + 0x7E4A,0x9140, // <cjk> + 0x7E4B,0x8C71, // <cjk> + 0x7E4D,0x8F4A, // <cjk> + 0x7E54,0x9044, // <cjk> + 0x7E55,0x9155, // <cjk> + 0x7E56,0xE384, // <cjk> + 0x7E59,0xE386, // <cjk> + 0x7E5A,0xE387, // <cjk> + 0x7E5D,0xE383, // <cjk> + 0x7E5E,0xE385, // <cjk> + 0x7E66,0xE379, // <cjk> + 0x7E67,0xE382, // <cjk> + 0x7E69,0xE38A, // <cjk> + 0x7E6A,0xE389, // <cjk> + 0x7E6D,0x969A, // <cjk> + 0x7E70,0x8C4A, // <cjk> + 0x7E79,0xE388, // <cjk> + 0x7E7B,0xE38C, // <cjk> + 0x7E7C,0xE38B, // <cjk> + 0x7E7D,0xE38F, // <cjk> + 0x7E7F,0xE391, // <cjk> + 0x7E83,0xE38D, // <cjk> + 0x7E88,0xE392, // <cjk> + 0x7E89,0xE393, // <cjk> + 0x7E8C,0xE394, // <cjk> + 0x7E8E,0xE39A, // <cjk> + 0x7E8F,0x935A, // <cjk> + 0x7E90,0xE396, // <cjk> + 0x7E92,0xE395, // <cjk> + 0x7E93,0xE397, // <cjk> + 0x7E94,0xE398, // <cjk> + 0x7E96,0xE399, // <cjk> + 0x7E9B,0xE39B, // <cjk> + 0x7E9C,0xE39C, // <cjk> + 0x7F36,0x8ACA, // <cjk> + 0x7F38,0xE39D, // <cjk> + 0x7F3A,0xE39E, // <cjk> + 0x7F45,0xE39F, // <cjk> + 0x7F4C,0xE3A0, // <cjk> + 0x7F4D,0xE3A1, // <cjk> + 0x7F4E,0xE3A2, // <cjk> + 0x7F50,0xE3A3, // <cjk> + 0x7F51,0xE3A4, // <cjk> + 0x7F54,0xE3A6, // <cjk> + 0x7F55,0xE3A5, // <cjk> + 0x7F58,0xE3A7, // <cjk> + 0x7F5F,0xE3A8, // <cjk> + 0x7F60,0xE3A9, // <cjk> + 0x7F67,0xE3AC, // <cjk> + 0x7F68,0xE3AA, // <cjk> + 0x7F69,0xE3AB, // <cjk> + 0x7F6A,0x8DDF, // <cjk> + 0x7F6B,0x8C72, // <cjk> + 0x7F6E,0x9275, // <cjk> + 0x7F70,0x94B1, // <cjk> + 0x7F72,0x8F90, // <cjk> + 0x7F75,0x946C, // <cjk> + 0x7F77,0x94EB, // <cjk> + 0x7F78,0xE3AD, // <cjk> + 0x7F79,0x9CEB, // <cjk> + 0x7F82,0xE3AE, // <cjk> + 0x7F83,0xE3B0, // <cjk> + 0x7F85,0x9785, // <cjk> + 0x7F86,0xE3AF, // <cjk> + 0x7F87,0xE3B2, // <cjk> + 0x7F88,0xE3B1, // <cjk> + 0x7F8A,0x9772, // <cjk> + 0x7F8C,0xE3B3, // <cjk> + 0x7F8E,0x94FC, // <cjk> + 0x7F94,0xE3B4, // <cjk> + 0x7F9A,0xE3B7, // <cjk> + 0x7F9D,0xE3B6, // <cjk> + 0x7F9E,0xE3B5, // <cjk> + 0x7FA3,0xE3B8, // <cjk> + 0x7FA4,0x8C51, // <cjk> + 0x7FA8,0x9141, // <cjk> + 0x7FA9,0x8B60, // <cjk> + 0x7FAE,0xE3BC, // <cjk> + 0x7FAF,0xE3B9, // <cjk> + 0x7FB2,0xE3BA, // <cjk> + 0x7FB6,0xE3BD, // <cjk> + 0x7FB8,0xE3BE, // <cjk> + 0x7FB9,0xE3BB, // <cjk> + 0x7FBD,0x8948, // <cjk> + 0x7FC1,0x89A5, // <cjk> + 0x7FC5,0xE3C0, // <cjk> + 0x7FC6,0xE3C1, // <cjk> + 0x7FCA,0xE3C2, // <cjk> + 0x7FCC,0x9782, // <cjk> + 0x7FD2,0x8F4B, // <cjk> + 0x7FD4,0xE3C4, // <cjk> + 0x7FD5,0xE3C3, // <cjk> + 0x7FE0,0x9089, // <cjk> + 0x7FE1,0xE3C5, // <cjk> + 0x7FE6,0xE3C6, // <cjk> + 0x7FE9,0xE3C7, // <cjk> + 0x7FEB,0x8AE3, // <cjk> + 0x7FF0,0x8ACB, // <cjk> + 0x7FF3,0xE3C8, // <cjk> + 0x7FF9,0xE3C9, // <cjk> + 0x7FFB,0x967C, // <cjk> + 0x7FFC,0x9783, // <cjk> + 0x8000,0x9773, // <cjk> + 0x8001,0x9856, // <cjk> + 0x8003,0x8D6C, // <cjk> + 0x8004,0xE3CC, // <cjk> + 0x8005,0x8ED2, // <cjk> + 0x8006,0xE3CB, // <cjk> + 0x800B,0xE3CD, // <cjk> + 0x800C,0x8EA7, // <cjk> + 0x8010,0x91CF, // <cjk> + 0x8012,0xE3CE, // <cjk> + 0x8015,0x8D6B, // <cjk> + 0x8017,0x96D5, // <cjk> + 0x8018,0xE3CF, // <cjk> + 0x8019,0xE3D0, // <cjk> + 0x801C,0xE3D1, // <cjk> + 0x8021,0xE3D2, // <cjk> + 0x8028,0xE3D3, // <cjk> + 0x8033,0x8EA8, // <cjk> + 0x8036,0x96EB, // <cjk> + 0x803B,0xE3D5, // <cjk> + 0x803D,0x925E, // <cjk> + 0x803F,0xE3D4, // <cjk> + 0x8046,0xE3D7, // <cjk> + 0x804A,0xE3D6, // <cjk> + 0x8052,0xE3D8, // <cjk> + 0x8056,0x90B9, // <cjk> + 0x8058,0xE3D9, // <cjk> + 0x805A,0xE3DA, // <cjk> + 0x805E,0x95B7, // <cjk> + 0x805F,0xE3DB, // <cjk> + 0x8061,0x918F, // <cjk> + 0x8062,0xE3DC, // <cjk> + 0x8068,0xE3DD, // <cjk> + 0x806F,0x97FC, // <cjk> + 0x8070,0xE3E0, // <cjk> + 0x8072,0xE3DF, // <cjk> + 0x8073,0xE3DE, // <cjk> + 0x8074,0x92AE, // <cjk> + 0x8076,0xE3E1, // <cjk> + 0x8077,0x9045, // <cjk> + 0x8079,0xE3E2, // <cjk> + 0x807D,0xE3E3, // <cjk> + 0x807E,0x9857, // <cjk> + 0x807F,0xE3E4, // <cjk> + 0x8084,0xE3E5, // <cjk> + 0x8085,0xE3E7, // <cjk> + 0x8086,0xE3E6, // <cjk> + 0x8087,0x94A3, // <cjk> + 0x8089,0x93F7, // <cjk> + 0x808B,0x985D, // <cjk> + 0x808C,0x94A7, // <cjk> + 0x8093,0xE3E9, // <cjk> + 0x8096,0x8FD1, // <cjk> + 0x8098,0x9549, // <cjk> + 0x809A,0xE3EA, // <cjk> + 0x809B,0xE3E8, // <cjk> + 0x809D,0x8ACC, // <cjk> + 0x80A1,0x8CD2, // <cjk> + 0x80A2,0x8E88, // <cjk> + 0x80A5,0x94EC, // <cjk> + 0x80A9,0x8CA8, // <cjk> + 0x80AA,0x9662, // <cjk> + 0x80AC,0xE3ED, // <cjk> + 0x80AD,0xE3EB, // <cjk> + 0x80AF,0x8D6D, // <cjk> + 0x80B1,0x8D6E, // <cjk> + 0x80B2,0x88E7, // <cjk> + 0x80B4,0x8DE6, // <cjk> + 0x80BA,0x9478, // <cjk> + 0x80C3,0x88DD, // <cjk> + 0x80C4,0xE3F2, // <cjk> + 0x80C6,0x925F, // <cjk> + 0x80CC,0x9477, // <cjk> + 0x80CE,0x91D9, // <cjk> + 0x80D6,0xE3F4, // <cjk> + 0x80D9,0xE3F0, // <cjk> + 0x80DA,0xE3F3, // <cjk> + 0x80DB,0xE3EE, // <cjk> + 0x80DD,0xE3F1, // <cjk> + 0x80DE,0x9645, // <cjk> + 0x80E1,0x8CD3, // <cjk> + 0x80E4,0x88FB, // <cjk> + 0x80E5,0xE3EF, // <cjk> + 0x80EF,0xE3F6, // <cjk> + 0x80F1,0xE3F7, // <cjk> + 0x80F4,0x93B7, // <cjk> + 0x80F8,0x8BB9, // <cjk> + 0x80FC,0xE445, // <cjk> + 0x80FD,0x945C, // <cjk> + 0x8102,0x8E89, // <cjk> + 0x8105,0x8BBA, // <cjk> + 0x8106,0x90C6, // <cjk> + 0x8107,0x9865, // <cjk> + 0x8108,0x96AC, // <cjk> + 0x8109,0xE3F5, // <cjk> + 0x810A,0x90D2, // <cjk> + 0x811A,0x8B72, // <cjk> + 0x811B,0xE3F8, // <cjk> + 0x8123,0xE3FA, // <cjk> + 0x8129,0xE3F9, // <cjk> + 0x812F,0xE3FB, // <cjk> + 0x8131,0x9245, // <cjk> + 0x8133,0x945D, // <cjk> + 0x8139,0x92AF, // <cjk> + 0x813E,0xE442, // <cjk> + 0x8146,0xE441, // <cjk> + 0x814B,0xE3FC, // <cjk> + 0x814E,0x9074, // <cjk> + 0x8150,0x9585, // <cjk> + 0x8151,0xE444, // <cjk> + 0x8153,0xE443, // <cjk> + 0x8154,0x8D6F, // <cjk> + 0x8155,0x9872, // <cjk> + 0x815F,0xE454, // <cjk> + 0x8165,0xE448, // <cjk> + 0x8166,0xE449, // <cjk> + 0x816B,0x8EEE, // <cjk> + 0x816E,0xE447, // <cjk> + 0x8170,0x8D98, // <cjk> + 0x8171,0xE446, // <cjk> + 0x8174,0xE44A, // <cjk> + 0x8178,0x92B0, // <cjk> + 0x8179,0x95A0, // <cjk> + 0x817A,0x9142, // <cjk> + 0x817F,0x91DA, // <cjk> + 0x8180,0xE44E, // <cjk> + 0x8182,0xE44F, // <cjk> + 0x8183,0xE44B, // <cjk> + 0x8188,0xE44C, // <cjk> + 0x818A,0xE44D, // <cjk> + 0x818F,0x8D70, // <cjk> + 0x8193,0xE455, // <cjk> + 0x8195,0xE451, // <cjk> + 0x819A,0x9586, // <cjk> + 0x819C,0x968C, // <cjk> + 0x819D,0x9547, // <cjk> + 0x81A0,0xE450, // <cjk> + 0x81A3,0xE453, // <cjk> + 0x81A4,0xE452, // <cjk> + 0x81A8,0x9663, // <cjk> + 0x81A9,0xE456, // <cjk> + 0x81B0,0xE457, // <cjk> + 0x81B3,0x9156, // <cjk> + 0x81B5,0xE458, // <cjk> + 0x81B8,0xE45A, // <cjk> + 0x81BA,0xE45E, // <cjk> + 0x81BE,0xE459, // <cjk> + 0x81BF,0x945E, // <cjk> + 0x81C0,0xE45C, // <cjk> + 0x81C2,0xE45D, // <cjk> + 0x81C6,0x89B0, // <cjk> + 0x81C8,0xE464, // <cjk> + 0x81C9,0xE45F, // <cjk> + 0x81CD,0xE460, // <cjk> + 0x81D1,0xE461, // <cjk> + 0x81D3,0x919F, // <cjk> + 0x81D8,0xE463, // <cjk> + 0x81D9,0xE462, // <cjk> + 0x81DA,0xE465, // <cjk> + 0x81DF,0xE466, // <cjk> + 0x81E0,0xE467, // <cjk> + 0x81E3,0x9062, // <cjk> + 0x81E5,0x89E7, // <cjk> + 0x81E7,0xE468, // <cjk> + 0x81E8,0x97D5, // <cjk> + 0x81EA,0x8EA9, // <cjk> + 0x81ED,0x8F4C, // <cjk> + 0x81F3,0x8E8A, // <cjk> + 0x81F4,0x9276, // <cjk> + 0x81FA,0xE469, // <cjk> + 0x81FB,0xE46A, // <cjk> + 0x81FC,0x8950, // <cjk> + 0x81FE,0xE46B, // <cjk> + 0x8201,0xE46C, // <cjk> + 0x8202,0xE46D, // <cjk> + 0x8205,0xE46E, // <cjk> + 0x8207,0xE46F, // <cjk> + 0x8208,0x8BBB, // <cjk> + 0x8209,0x9DA8, // <cjk> + 0x820A,0xE470, // <cjk> + 0x820C,0x90E3, // <cjk> + 0x820D,0xE471, // <cjk> + 0x820E,0x8EC9, // <cjk> + 0x8210,0xE472, // <cjk> + 0x8212,0x98AE, // <cjk> + 0x8216,0xE473, // <cjk> + 0x8217,0x95DC, // <cjk> + 0x8218,0x8ADA, // <cjk> + 0x821B,0x9143, // <cjk> + 0x821C,0x8F77, // <cjk> + 0x821E,0x9591, // <cjk> + 0x821F,0x8F4D, // <cjk> + 0x8229,0xE474, // <cjk> + 0x822A,0x8D71, // <cjk> + 0x822B,0xE475, // <cjk> + 0x822C,0x94CA, // <cjk> + 0x822E,0xE484, // <cjk> + 0x8233,0xE477, // <cjk> + 0x8235,0x91C7, // <cjk> + 0x8236,0x9495, // <cjk> + 0x8237,0x8CBD, // <cjk> + 0x8238,0xE476, // <cjk> + 0x8239,0x9144, // <cjk> + 0x8240,0xE478, // <cjk> + 0x8247,0x92F8, // <cjk> + 0x8258,0xE47A, // <cjk> + 0x8259,0xE479, // <cjk> + 0x825A,0xE47C, // <cjk> + 0x825D,0xE47B, // <cjk> + 0x825F,0xE47D, // <cjk> + 0x8262,0xE480, // <cjk> + 0x8264,0xE47E, // <cjk> + 0x8266,0x8ACD, // <cjk> + 0x8268,0xE481, // <cjk> + 0x826A,0xE482, // <cjk> + 0x826B,0xE483, // <cjk> + 0x826E,0x8DAF, // <cjk> + 0x826F,0x97C7, // <cjk> + 0x8271,0xE485, // <cjk> + 0x8272,0x9046, // <cjk> + 0x8276,0x8990, // <cjk> + 0x8277,0xE486, // <cjk> + 0x8278,0xE487, // <cjk> + 0x827E,0xE488, // <cjk> + 0x828B,0x88F0, // <cjk> + 0x828D,0xE489, // <cjk> + 0x8292,0xE48A, // <cjk> + 0x8299,0x9587, // <cjk> + 0x829D,0x8EC5, // <cjk> + 0x829F,0xE48C, // <cjk> + 0x82A5,0x8A48, // <cjk> + 0x82A6,0x88B0, // <cjk> + 0x82AB,0xE48B, // <cjk> + 0x82AC,0xE48E, // <cjk> + 0x82AD,0x946D, // <cjk> + 0x82AF,0x9063, // <cjk> + 0x82B1,0x89D4, // <cjk> + 0x82B3,0x9646, // <cjk> + 0x82B8,0x8C7C, // <cjk> + 0x82B9,0x8BDA, // <cjk> + 0x82BB,0xE48D, // <cjk> + 0x82BD,0x89E8, // <cjk> + 0x82C5,0x8AA1, // <cjk> + 0x82D1,0x8991, // <cjk> + 0x82D2,0xE492, // <cjk> + 0x82D3,0x97E8, // <cjk> + 0x82D4,0x91DB, // <cjk> + 0x82D7,0x9563, // <cjk> + 0x82D9,0xE49E, // <cjk> + 0x82DB,0x89D5, // <cjk> + 0x82DC,0xE49C, // <cjk> + 0x82DE,0xE49A, // <cjk> + 0x82DF,0xE491, // <cjk> + 0x82E1,0xE48F, // <cjk> + 0x82E3,0xE490, // <cjk> + 0x82E5,0x8EE1, // <cjk> + 0x82E6,0x8BEA, // <cjk> + 0x82E7,0x9297, // <cjk> + 0x82EB,0x93CF, // <cjk> + 0x82F1,0x8970, // <cjk> + 0x82F3,0xE494, // <cjk> + 0x82F4,0xE493, // <cjk> + 0x82F9,0xE499, // <cjk> + 0x82FA,0xE495, // <cjk> + 0x82FB,0xE498, // <cjk> + 0x8302,0x96CE, // <cjk> + 0x8303,0xE497, // <cjk> + 0x8304,0x89D6, // <cjk> + 0x8305,0x8A9D, // <cjk> + 0x8306,0xE49B, // <cjk> + 0x8309,0xE49D, // <cjk> + 0x830E,0x8C73, // <cjk> + 0x8316,0xE4A1, // <cjk> + 0x8317,0xE4AA, // <cjk> + 0x8318,0xE4AB, // <cjk> + 0x831C,0x88A9, // <cjk> + 0x8323,0xE4B2, // <cjk> + 0x8328,0x88EF, // <cjk> + 0x832B,0xE4A9, // <cjk> + 0x832F,0xE4A8, // <cjk> + 0x8331,0xE4A3, // <cjk> + 0x8332,0xE4A2, // <cjk> + 0x8334,0xE4A0, // <cjk> + 0x8335,0xE49F, // <cjk> + 0x8336,0x9283, // <cjk> + 0x8338,0x91F9, // <cjk> + 0x8339,0xE4A5, // <cjk> + 0x8340,0xE4A4, // <cjk> + 0x8345,0xE4A7, // <cjk> + 0x8349,0x9190, // <cjk> + 0x834A,0x8C74, // <cjk> + 0x834F,0x8960, // <cjk> + 0x8350,0xE4A6, // <cjk> + 0x8352,0x8D72, // <cjk> + 0x8358,0x9191, // <cjk> + 0x8373,0xE4B8, // <cjk> + 0x8375,0xE4B9, // <cjk> + 0x8377,0x89D7, // <cjk> + 0x837B,0x89AC, // <cjk> + 0x837C,0xE4B6, // <cjk> + 0x8385,0xE4AC, // <cjk> + 0x8387,0xE4B4, // <cjk> + 0x8389,0xE4BB, // <cjk> + 0x838A,0xE4B5, // <cjk> + 0x838E,0xE4B3, // <cjk> + 0x8393,0xE496, // <cjk> + 0x8396,0xE4B1, // <cjk> + 0x839A,0xE4AD, // <cjk> + 0x839E,0x8ACE, // <cjk> + 0x839F,0xE4AF, // <cjk> + 0x83A0,0xE4BA, // <cjk> + 0x83A2,0xE4B0, // <cjk> + 0x83A8,0xE4BC, // <cjk> + 0x83AA,0xE4AE, // <cjk> + 0x83AB,0x949C, // <cjk> + 0x83B1,0x9789, // <cjk> + 0x83B5,0xE4B7, // <cjk> + 0x83BD,0xE4CD, // <cjk> + 0x83C1,0xE4C5, // <cjk> + 0x83C5,0x909B, // <cjk> + 0x83CA,0x8B65, // <cjk> + 0x83CC,0x8BDB, // <cjk> + 0x83CE,0xE4C0, // <cjk> + 0x83D3,0x89D9, // <cjk> + 0x83D6,0x8FD2, // <cjk> + 0x83D8,0xE4C3, // <cjk> + 0x83DC,0x8DD8, // <cjk> + 0x83DF,0x9370, // <cjk> + 0x83E0,0xE4C8, // <cjk> + 0x83E9,0x95EC, // <cjk> + 0x83EB,0xE4BF, // <cjk> + 0x83EF,0x89D8, // <cjk> + 0x83F0,0x8CD4, // <cjk> + 0x83F1,0x9548, // <cjk> + 0x83F2,0xE4C9, // <cjk> + 0x83F4,0xE4BD, // <cjk> + 0x83F7,0xE4C6, // <cjk> + 0x83FB,0xE4D0, // <cjk> + 0x83FD,0xE4C1, // <cjk> + 0x8403,0xE4C2, // <cjk> + 0x8404,0x93B8, // <cjk> + 0x8407,0xE4C7, // <cjk> + 0x840B,0xE4C4, // <cjk> + 0x840C,0x9647, // <cjk> + 0x840D,0xE4CA, // <cjk> + 0x840E,0x88DE, // <cjk> + 0x8413,0xE4BE, // <cjk> + 0x8420,0xE4CC, // <cjk> + 0x8422,0xE4CB, // <cjk> + 0x8429,0x948B, // <cjk> + 0x842A,0xE4D2, // <cjk> + 0x842C,0xE4DD, // <cjk> + 0x8431,0x8A9E, // <cjk> + 0x8435,0xE4E0, // <cjk> + 0x8438,0xE4CE, // <cjk> + 0x843C,0xE4D3, // <cjk> + 0x843D,0x978E, // <cjk> + 0x8446,0xE4DC, // <cjk> + 0x8449,0x9774, // <cjk> + 0x844E,0x97A8, // <cjk> + 0x8457,0x9298, // <cjk> + 0x845B,0x8A8B, // <cjk> + 0x8461,0x9592, // <cjk> + 0x8462,0xE4E2, // <cjk> + 0x8463,0x939F, // <cjk> + 0x8466,0x88AF, // <cjk> + 0x8469,0xE4DB, // <cjk> + 0x846B,0xE4D7, // <cjk> + 0x846C,0x9192, // <cjk> + 0x846D,0xE4D1, // <cjk> + 0x846E,0xE4D9, // <cjk> + 0x846F,0xE4DE, // <cjk> + 0x8471,0x944B, // <cjk> + 0x8475,0x88A8, // <cjk> + 0x8477,0xE4D6, // <cjk> + 0x8479,0xE4DF, // <cjk> + 0x847A,0x9598, // <cjk> + 0x8482,0xE4DA, // <cjk> + 0x8484,0xE4D5, // <cjk> + 0x848B,0x8FD3, // <cjk> + 0x8490,0x8F4E, // <cjk> + 0x8494,0x8EAA, // <cjk> + 0x8499,0x96D6, // <cjk> + 0x849C,0x9566, // <cjk> + 0x849F,0xE4E5, // <cjk> + 0x84A1,0xE4EE, // <cjk> + 0x84AD,0xE4D8, // <cjk> + 0x84B2,0x8A97, // <cjk> + 0x84B8,0x8FF6, // <cjk> + 0x84B9,0xE4E3, // <cjk> + 0x84BB,0xE4E8, // <cjk> + 0x84BC,0x9193, // <cjk> + 0x84BF,0xE4E4, // <cjk> + 0x84C1,0xE4EB, // <cjk> + 0x84C4,0x927E, // <cjk> + 0x84C6,0xE4EC, // <cjk> + 0x84C9,0x9775, // <cjk> + 0x84CA,0xE4E1, // <cjk> + 0x84CB,0x8A57, // <cjk> + 0x84CD,0xE4E7, // <cjk> + 0x84D0,0xE4EA, // <cjk> + 0x84D1,0x96AA, // <cjk> + 0x84D6,0xE4ED, // <cjk> + 0x84D9,0xE4E6, // <cjk> + 0x84DA,0xE4E9, // <cjk> + 0x84EC,0x9648, // <cjk> + 0x84EE,0x9840, // <cjk> + 0x84F4,0xE4F1, // <cjk> + 0x84FC,0xE4F8, // <cjk> + 0x84FF,0xE4F0, // <cjk> + 0x8500,0x8EC1, // <cjk> + 0x8506,0xE4CF, // <cjk> + 0x8511,0x95CC, // <cjk> + 0x8513,0x96A0, // <cjk> + 0x8514,0xE4F7, // <cjk> + 0x8515,0xE4F6, // <cjk> + 0x8517,0xE4F2, // <cjk> + 0x8518,0xE4F3, // <cjk> + 0x851A,0x8955, // <cjk> + 0x851F,0xE4F5, // <cjk> + 0x8521,0xE4EF, // <cjk> + 0x8526,0x92D3, // <cjk> + 0x852C,0xE4F4, // <cjk> + 0x852D,0x88FC, // <cjk> + 0x8535,0x91A0, // <cjk> + 0x853D,0x95C1, // <cjk> + 0x8540,0xE4F9, // <cjk> + 0x8541,0xE540, // <cjk> + 0x8543,0x94D7, // <cjk> + 0x8548,0xE4FC, // <cjk> + 0x8549,0x8FD4, // <cjk> + 0x854A,0x8EC7, // <cjk> + 0x854B,0xE542, // <cjk> + 0x854E,0x8BBC, // <cjk> + 0x8555,0xE543, // <cjk> + 0x8557,0x9599, // <cjk> + 0x8558,0xE4FB, // <cjk> + 0x855A,0xE4D4, // <cjk> + 0x8563,0xE4FA, // <cjk> + 0x8568,0x986E, // <cjk> + 0x8569,0x93A0, // <cjk> + 0x856A,0x9593, // <cjk> + 0x856D,0xE54A, // <cjk> + 0x8577,0xE550, // <cjk> + 0x857E,0xE551, // <cjk> + 0x8580,0xE544, // <cjk> + 0x8584,0x9496, // <cjk> + 0x8587,0xE54E, // <cjk> + 0x8588,0xE546, // <cjk> + 0x858A,0xE548, // <cjk> + 0x8590,0xE552, // <cjk> + 0x8591,0xE547, // <cjk> + 0x8594,0xE54B, // <cjk> + 0x8597,0x8992, // <cjk> + 0x8599,0x93E3, // <cjk> + 0x859B,0xE54C, // <cjk> + 0x859C,0xE54F, // <cjk> + 0x85A4,0xE545, // <cjk> + 0x85A6,0x9145, // <cjk> + 0x85A8,0xE549, // <cjk> + 0x85A9,0x8E46, // <cjk> + 0x85AA,0x9064, // <cjk> + 0x85AB,0x8C4F, // <cjk> + 0x85AC,0x96F2, // <cjk> + 0x85AE,0x96F7, // <cjk> + 0x85AF,0x8F92, // <cjk> + 0x85B9,0xE556, // <cjk> + 0x85BA,0xE554, // <cjk> + 0x85C1,0x986D, // <cjk> + 0x85C9,0xE553, // <cjk> + 0x85CD,0x9795, // <cjk> + 0x85CF,0xE555, // <cjk> + 0x85D0,0xE557, // <cjk> + 0x85D5,0xE558, // <cjk> + 0x85DD,0xE559, // <cjk> + 0x85E4,0x93A1, // <cjk> + 0x85E5,0xE55A, // <cjk> + 0x85E9,0x94CB, // <cjk> + 0x85EA,0xE54D, // <cjk> + 0x85F7,0x8F93, // <cjk> + 0x85F9,0xE55C, // <cjk> + 0x85FA,0xE561, // <cjk> + 0x85FB,0x9194, // <cjk> + 0x85FE,0xE560, // <cjk> + 0x8602,0xE541, // <cjk> + 0x8606,0xE562, // <cjk> + 0x8607,0x9168, // <cjk> + 0x860A,0xE55D, // <cjk> + 0x860B,0xE55F, // <cjk> + 0x8613,0xE55E, // <cjk> + 0x8616,0x9F50, // <cjk> + 0x8617,0x9F41, // <cjk> + 0x861A,0xE564, // <cjk> + 0x8622,0xE563, // <cjk> + 0x862D,0x9796, // <cjk> + 0x862F,0xE1BA, // <cjk> + 0x8630,0xE565, // <cjk> + 0x863F,0xE566, // <cjk> + 0x864D,0xE567, // <cjk> + 0x864E,0x8CD5, // <cjk> + 0x8650,0x8B73, // <cjk> + 0x8654,0xE569, // <cjk> + 0x8655,0x997C, // <cjk> + 0x865A,0x8B95, // <cjk> + 0x865C,0x97B8, // <cjk> + 0x865E,0x8BF1, // <cjk> + 0x865F,0xE56A, // <cjk> + 0x8667,0xE56B, // <cjk> + 0x866B,0x928E, // <cjk> + 0x8671,0xE56C, // <cjk> + 0x8679,0x93F8, // <cjk> + 0x867B,0x88B8, // <cjk> + 0x868A,0x89E1, // <cjk> + 0x868B,0xE571, // <cjk> + 0x868C,0xE572, // <cjk> + 0x8693,0xE56D, // <cjk> + 0x8695,0x8E5C, // <cjk> + 0x86A3,0xE56E, // <cjk> + 0x86A4,0x9461, // <cjk> + 0x86A9,0xE56F, // <cjk> + 0x86AA,0xE570, // <cjk> + 0x86AB,0xE57A, // <cjk> + 0x86AF,0xE574, // <cjk> + 0x86B0,0xE577, // <cjk> + 0x86B6,0xE573, // <cjk> + 0x86C4,0xE575, // <cjk> + 0x86C6,0xE576, // <cjk> + 0x86C7,0x8ED6, // <cjk> + 0x86C9,0xE578, // <cjk> + 0x86CB,0x9260, // <cjk> + 0x86CD,0x8C75, // <cjk> + 0x86CE,0x8A61, // <cjk> + 0x86D4,0xE57B, // <cjk> + 0x86D9,0x8A5E, // <cjk> + 0x86DB,0xE581, // <cjk> + 0x86DE,0xE57C, // <cjk> + 0x86DF,0xE580, // <cjk> + 0x86E4,0x94B8, // <cjk> + 0x86E9,0xE57D, // <cjk> + 0x86EC,0xE57E, // <cjk> + 0x86ED,0x9567, // <cjk> + 0x86EE,0x94D8, // <cjk> + 0x86EF,0xE582, // <cjk> + 0x86F8,0x91FB, // <cjk> + 0x86F9,0xE58C, // <cjk> + 0x86FB,0xE588, // <cjk> + 0x86FE,0x89E9, // <cjk> + 0x8700,0xE586, // <cjk> + 0x8702,0x9649, // <cjk> + 0x8703,0xE587, // <cjk> + 0x8706,0xE584, // <cjk> + 0x8708,0xE585, // <cjk> + 0x8709,0xE58A, // <cjk> + 0x870A,0xE58D, // <cjk> + 0x870D,0xE58B, // <cjk> + 0x8711,0xE589, // <cjk> + 0x8712,0xE583, // <cjk> + 0x8718,0x9277, // <cjk> + 0x871A,0xE594, // <cjk> + 0x871C,0x96A8, // <cjk> + 0x8725,0xE592, // <cjk> + 0x8729,0xE593, // <cjk> + 0x8734,0xE58E, // <cjk> + 0x8737,0xE590, // <cjk> + 0x873B,0xE591, // <cjk> + 0x873F,0xE58F, // <cjk> + 0x8749,0x90E4, // <cjk> + 0x874B,0x9858, // <cjk> + 0x874C,0xE598, // <cjk> + 0x874E,0xE599, // <cjk> + 0x8753,0xE59F, // <cjk> + 0x8755,0x9049, // <cjk> + 0x8757,0xE59B, // <cjk> + 0x8759,0xE59E, // <cjk> + 0x875F,0xE596, // <cjk> + 0x8760,0xE595, // <cjk> + 0x8763,0xE5A0, // <cjk> + 0x8766,0x89DA, // <cjk> + 0x8768,0xE59C, // <cjk> + 0x876A,0xE5A1, // <cjk> + 0x876E,0xE59D, // <cjk> + 0x8774,0xE59A, // <cjk> + 0x8776,0x92B1, // <cjk> + 0x8778,0xE597, // <cjk> + 0x877F,0x9488, // <cjk> + 0x8782,0xE5A5, // <cjk> + 0x878D,0x975A, // <cjk> + 0x879F,0xE5A4, // <cjk> + 0x87A2,0xE5A3, // <cjk> + 0x87AB,0xE5AC, // <cjk> + 0x87AF,0xE5A6, // <cjk> + 0x87B3,0xE5AE, // <cjk> + 0x87BA,0x9786, // <cjk> + 0x87BB,0xE5B1, // <cjk> + 0x87BD,0xE5A8, // <cjk> + 0x87C0,0xE5A9, // <cjk> + 0x87C4,0xE5AD, // <cjk> + 0x87C6,0xE5B0, // <cjk> + 0x87C7,0xE5AF, // <cjk> + 0x87CB,0xE5A7, // <cjk> + 0x87D0,0xE5AA, // <cjk> + 0x87D2,0xE5BB, // <cjk> + 0x87E0,0xE5B4, // <cjk> + 0x87EF,0xE5B2, // <cjk> + 0x87F2,0xE5B3, // <cjk> + 0x87F6,0xE5B8, // <cjk> + 0x87F7,0xE5B9, // <cjk> + 0x87F9,0x8A49, // <cjk> + 0x87FB,0x8B61, // <cjk> + 0x87FE,0xE5B7, // <cjk> + 0x8805,0xE5A2, // <cjk> + 0x880D,0xE5B6, // <cjk> + 0x880E,0xE5BA, // <cjk> + 0x880F,0xE5B5, // <cjk> + 0x8811,0xE5BC, // <cjk> + 0x8815,0xE5BE, // <cjk> + 0x8816,0xE5BD, // <cjk> + 0x8821,0xE5C0, // <cjk> + 0x8822,0xE5BF, // <cjk> + 0x8823,0xE579, // <cjk> + 0x8827,0xE5C4, // <cjk> + 0x8831,0xE5C1, // <cjk> + 0x8836,0xE5C2, // <cjk> + 0x8839,0xE5C3, // <cjk> + 0x883B,0xE5C5, // <cjk> + 0x8840,0x8C8C, // <cjk> + 0x8842,0xE5C7, // <cjk> + 0x8844,0xE5C6, // <cjk> + 0x8846,0x8F4F, // <cjk> + 0x884C,0x8D73, // <cjk> + 0x884D,0x9FA5, // <cjk> + 0x8852,0xE5C8, // <cjk> + 0x8853,0x8F70, // <cjk> + 0x8857,0x8A58, // <cjk> + 0x8859,0xE5C9, // <cjk> + 0x885B,0x8971, // <cjk> + 0x885D,0x8FD5, // <cjk> + 0x885E,0xE5CA, // <cjk> + 0x8861,0x8D74, // <cjk> + 0x8862,0xE5CB, // <cjk> + 0x8863,0x88DF, // <cjk> + 0x8868,0x955C, // <cjk> + 0x886B,0xE5CC, // <cjk> + 0x8870,0x908A, // <cjk> + 0x8872,0xE5D3, // <cjk> + 0x8875,0xE5D0, // <cjk> + 0x8877,0x928F, // <cjk> + 0x887D,0xE5D1, // <cjk> + 0x887E,0xE5CE, // <cjk> + 0x887F,0x8BDC, // <cjk> + 0x8881,0xE5CD, // <cjk> + 0x8882,0xE5D4, // <cjk> + 0x8888,0x8C55, // <cjk> + 0x888B,0x91DC, // <cjk> + 0x888D,0xE5DA, // <cjk> + 0x8892,0xE5D6, // <cjk> + 0x8896,0x91B3, // <cjk> + 0x8897,0xE5D5, // <cjk> + 0x8899,0xE5D8, // <cjk> + 0x889E,0xE5CF, // <cjk> + 0x88A2,0xE5D9, // <cjk> + 0x88A4,0xE5DB, // <cjk> + 0x88AB,0x94ED, // <cjk> + 0x88AE,0xE5D7, // <cjk> + 0x88B0,0xE5DC, // <cjk> + 0x88B1,0xE5DE, // <cjk> + 0x88B4,0x8CD1, // <cjk> + 0x88B5,0xE5D2, // <cjk> + 0x88B7,0x88BF, // <cjk> + 0x88BF,0xE5DD, // <cjk> + 0x88C1,0x8DD9, // <cjk> + 0x88C2,0x97F4, // <cjk> + 0x88C3,0xE5DF, // <cjk> + 0x88C4,0xE5E0, // <cjk> + 0x88C5,0x9195, // <cjk> + 0x88CF,0x97A0, // <cjk> + 0x88D4,0xE5E1, // <cjk> + 0x88D5,0x9754, // <cjk> + 0x88D8,0xE5E2, // <cjk> + 0x88D9,0xE5E3, // <cjk> + 0x88DC,0x95E2, // <cjk> + 0x88DD,0xE5E4, // <cjk> + 0x88DF,0x8DBE, // <cjk> + 0x88E1,0x97A1, // <cjk> + 0x88E8,0xE5E9, // <cjk> + 0x88F2,0xE5EA, // <cjk> + 0x88F3,0x8FD6, // <cjk> + 0x88F4,0xE5E8, // <cjk> + 0x88F8,0x9787, // <cjk> + 0x88F9,0xE5E5, // <cjk> + 0x88FC,0xE5E7, // <cjk> + 0x88FD,0x90BB, // <cjk> + 0x88FE,0x909E, // <cjk> + 0x8902,0xE5E6, // <cjk> + 0x8904,0xE5EB, // <cjk> + 0x8907,0x95A1, // <cjk> + 0x890A,0xE5ED, // <cjk> + 0x890C,0xE5EC, // <cjk> + 0x8910,0x8A8C, // <cjk> + 0x8912,0x964A, // <cjk> + 0x8913,0xE5EE, // <cjk> + 0x891D,0xE5FA, // <cjk> + 0x891E,0xE5F0, // <cjk> + 0x8925,0xE5F1, // <cjk> + 0x892A,0xE5F2, // <cjk> + 0x892B,0xE5F3, // <cjk> + 0x8936,0xE5F7, // <cjk> + 0x8938,0xE5F8, // <cjk> + 0x893B,0xE5F6, // <cjk> + 0x8941,0xE5F4, // <cjk> + 0x8943,0xE5EF, // <cjk> + 0x8944,0xE5F5, // <cjk> + 0x894C,0xE5F9, // <cjk> + 0x894D,0xE8B5, // <cjk> + 0x8956,0x89A6, // <cjk> + 0x895E,0xE5FC, // <cjk> + 0x895F,0x8BDD, // <cjk> + 0x8960,0xE5FB, // <cjk> + 0x8964,0xE641, // <cjk> + 0x8966,0xE640, // <cjk> + 0x896A,0xE643, // <cjk> + 0x896D,0xE642, // <cjk> + 0x896F,0xE644, // <cjk> + 0x8972,0x8F50, // <cjk> + 0x8974,0xE645, // <cjk> + 0x8977,0xE646, // <cjk> + 0x897E,0xE647, // <cjk> + 0x897F,0x90BC, // <cjk> + 0x8981,0x9776, // <cjk> + 0x8983,0xE648, // <cjk> + 0x8986,0x95A2, // <cjk> + 0x8987,0x9465, // <cjk> + 0x8988,0xE649, // <cjk> + 0x898A,0xE64A, // <cjk> + 0x898B,0x8CA9, // <cjk> + 0x898F,0x8B4B, // <cjk> + 0x8993,0xE64B, // <cjk> + 0x8996,0x8E8B, // <cjk> + 0x8997,0x9460, // <cjk> + 0x8998,0xE64C, // <cjk> + 0x899A,0x8A6F, // <cjk> + 0x89A1,0xE64D, // <cjk> + 0x89A6,0xE64F, // <cjk> + 0x89A7,0x9797, // <cjk> + 0x89A9,0xE64E, // <cjk> + 0x89AA,0x9065, // <cjk> + 0x89AC,0xE650, // <cjk> + 0x89AF,0xE651, // <cjk> + 0x89B2,0xE652, // <cjk> + 0x89B3,0x8ACF, // <cjk> + 0x89BA,0xE653, // <cjk> + 0x89BD,0xE654, // <cjk> + 0x89BF,0xE655, // <cjk> + 0x89C0,0xE656, // <cjk> + 0x89D2,0x8A70, // <cjk> + 0x89DA,0xE657, // <cjk> + 0x89DC,0xE658, // <cjk> + 0x89DD,0xE659, // <cjk> + 0x89E3,0x89F0, // <cjk> + 0x89E6,0x9047, // <cjk> + 0x89E7,0xE65A, // <cjk> + 0x89F8,0xE65C, // <cjk> + 0x8A00,0x8CBE, // <cjk> + 0x8A02,0x92F9, // <cjk> + 0x8A03,0xE65D, // <cjk> + 0x8A08,0x8C76, // <cjk> + 0x8A0A,0x9075, // <cjk> + 0x8A0C,0xE660, // <cjk> + 0x8A0E,0x93A2, // <cjk> + 0x8A10,0xE65F, // <cjk> + 0x8A13,0x8C50, // <cjk> + 0x8A16,0xE65E, // <cjk> + 0x8A17,0x91F5, // <cjk> + 0x8A18,0x8B4C, // <cjk> + 0x8A1B,0xE661, // <cjk> + 0x8A1D,0xE662, // <cjk> + 0x8A1F,0x8FD7, // <cjk> + 0x8A23,0x8C8D, // <cjk> + 0x8A25,0xE663, // <cjk> + 0x8A2A,0x964B, // <cjk> + 0x8A2D,0x90DD, // <cjk> + 0x8A31,0x8B96, // <cjk> + 0x8A33,0x96F3, // <cjk> + 0x8A34,0x9169, // <cjk> + 0x8A36,0xE664, // <cjk> + 0x8A3A,0x9066, // <cjk> + 0x8A3B,0x9290, // <cjk> + 0x8A3C,0x8FD8, // <cjk> + 0x8A41,0xE665, // <cjk> + 0x8A46,0xE668, // <cjk> + 0x8A48,0xE669, // <cjk> + 0x8A50,0x8DBC, // <cjk> + 0x8A51,0x91C0, // <cjk> + 0x8A52,0xE667, // <cjk> + 0x8A54,0x8FD9, // <cjk> + 0x8A55,0x955D, // <cjk> + 0x8A5B,0xE666, // <cjk> + 0x8A5E,0x8E8C, // <cjk> + 0x8A60,0x8972, // <cjk> + 0x8A62,0xE66D, // <cjk> + 0x8A63,0x8C77, // <cjk> + 0x8A66,0x8E8E, // <cjk> + 0x8A69,0x8E8D, // <cjk> + 0x8A6B,0x986C, // <cjk> + 0x8A6C,0xE66C, // <cjk> + 0x8A6D,0xE66B, // <cjk> + 0x8A6E,0x9146, // <cjk> + 0x8A70,0x8B6C, // <cjk> + 0x8A71,0x9862, // <cjk> + 0x8A72,0x8A59, // <cjk> + 0x8A73,0x8FDA, // <cjk> + 0x8A7C,0xE66A, // <cjk> + 0x8A82,0xE66F, // <cjk> + 0x8A84,0xE670, // <cjk> + 0x8A85,0xE66E, // <cjk> + 0x8A87,0x8CD6, // <cjk> + 0x8A89,0x975F, // <cjk> + 0x8A8C,0x8E8F, // <cjk> + 0x8A8D,0x9446, // <cjk> + 0x8A91,0xE673, // <cjk> + 0x8A93,0x90BE, // <cjk> + 0x8A95,0x9261, // <cjk> + 0x8A98,0x9755, // <cjk> + 0x8A9A,0xE676, // <cjk> + 0x8A9E,0x8CEA, // <cjk> + 0x8AA0,0x90BD, // <cjk> + 0x8AA1,0xE672, // <cjk> + 0x8AA3,0xE677, // <cjk> + 0x8AA4,0x8CEB, // <cjk> + 0x8AA5,0xE674, // <cjk> + 0x8AA6,0xE675, // <cjk> + 0x8AA8,0xE671, // <cjk> + 0x8AAC,0x90E0, // <cjk> + 0x8AAD,0x93C7, // <cjk> + 0x8AB0,0x924E, // <cjk> + 0x8AB2,0x89DB, // <cjk> + 0x8AB9,0x94EE, // <cjk> + 0x8ABC,0x8B62, // <cjk> + 0x8ABF,0x92B2, // <cjk> + 0x8AC2,0xE67A, // <cjk> + 0x8AC4,0xE678, // <cjk> + 0x8AC7,0x926B, // <cjk> + 0x8ACB,0x90BF, // <cjk> + 0x8ACC,0x8AD0, // <cjk> + 0x8ACD,0xE679, // <cjk> + 0x8ACF,0x907A, // <cjk> + 0x8AD2,0x97C8, // <cjk> + 0x8AD6,0x985F, // <cjk> + 0x8ADA,0xE67B, // <cjk> + 0x8ADB,0xE687, // <cjk> + 0x8ADC,0x92B3, // <cjk> + 0x8ADE,0xE686, // <cjk> + 0x8AE0,0xE683, // <cjk> + 0x8AE1,0xE68B, // <cjk> + 0x8AE2,0xE684, // <cjk> + 0x8AE4,0xE680, // <cjk> + 0x8AE6,0x92FA, // <cjk> + 0x8AE7,0xE67E, // <cjk> + 0x8AEB,0xE67C, // <cjk> + 0x8AED,0x9740, // <cjk> + 0x8AEE,0x8E90, // <cjk> + 0x8AF1,0xE681, // <cjk> + 0x8AF3,0xE67D, // <cjk> + 0x8AF7,0xE685, // <cjk> + 0x8AF8,0x8F94, // <cjk> + 0x8AFA,0x8CBF, // <cjk> + 0x8AFE,0x91F8, // <cjk> + 0x8B00,0x9664, // <cjk> + 0x8B01,0x8979, // <cjk> + 0x8B02,0x88E0, // <cjk> + 0x8B04,0x93A3, // <cjk> + 0x8B07,0xE689, // <cjk> + 0x8B0C,0xE688, // <cjk> + 0x8B0E,0x93E4, // <cjk> + 0x8B10,0xE68D, // <cjk> + 0x8B14,0xE682, // <cjk> + 0x8B16,0xE68C, // <cjk> + 0x8B17,0xE68E, // <cjk> + 0x8B19,0x8CAA, // <cjk> + 0x8B1A,0xE68A, // <cjk> + 0x8B1B,0x8D75, // <cjk> + 0x8B1D,0x8ED3, // <cjk> + 0x8B20,0xE68F, // <cjk> + 0x8B21,0x9777, // <cjk> + 0x8B26,0xE692, // <cjk> + 0x8B28,0xE695, // <cjk> + 0x8B2B,0xE693, // <cjk> + 0x8B2C,0x9554, // <cjk> + 0x8B33,0xE690, // <cjk> + 0x8B39,0x8BDE, // <cjk> + 0x8B3E,0xE694, // <cjk> + 0x8B41,0xE696, // <cjk> + 0x8B49,0xE69A, // <cjk> + 0x8B4C,0xE697, // <cjk> + 0x8B4E,0xE699, // <cjk> + 0x8B4F,0xE698, // <cjk> + 0x8B56,0xE69B, // <cjk> + 0x8B58,0x8EAF, // <cjk> + 0x8B5A,0xE69D, // <cjk> + 0x8B5B,0xE69C, // <cjk> + 0x8B5C,0x9588, // <cjk> + 0x8B5F,0xE69F, // <cjk> + 0x8B66,0x8C78, // <cjk> + 0x8B6B,0xE69E, // <cjk> + 0x8B6C,0xE6A0, // <cjk> + 0x8B6F,0xE6A1, // <cjk> + 0x8B70,0x8B63, // <cjk> + 0x8B71,0xE3BF, // <cjk> + 0x8B72,0x8FF7, // <cjk> + 0x8B74,0xE6A2, // <cjk> + 0x8B77,0x8CEC, // <cjk> + 0x8B7D,0xE6A3, // <cjk> + 0x8B80,0xE6A4, // <cjk> + 0x8B83,0x8E5D, // <cjk> + 0x8B8A,0x9DCC, // <cjk> + 0x8B8C,0xE6A5, // <cjk> + 0x8B8E,0xE6A6, // <cjk> + 0x8B90,0x8F51, // <cjk> + 0x8B92,0xE6A7, // <cjk> + 0x8B93,0xE6A8, // <cjk> + 0x8B96,0xE6A9, // <cjk> + 0x8B99,0xE6AA, // <cjk> + 0x8B9A,0xE6AB, // <cjk> + 0x8C37,0x924A, // <cjk> + 0x8C3A,0xE6AC, // <cjk> + 0x8C3F,0xE6AE, // <cjk> + 0x8C41,0xE6AD, // <cjk> + 0x8C46,0x93A4, // <cjk> + 0x8C48,0xE6AF, // <cjk> + 0x8C4A,0x964C, // <cjk> + 0x8C4C,0xE6B0, // <cjk> + 0x8C4E,0xE6B1, // <cjk> + 0x8C50,0xE6B2, // <cjk> + 0x8C55,0xE6B3, // <cjk> + 0x8C5A,0x93D8, // <cjk> + 0x8C61,0x8FDB, // <cjk> + 0x8C62,0xE6B4, // <cjk> + 0x8C6A,0x8D8B, // <cjk> + 0x8C6B,0x98AC, // <cjk> + 0x8C6C,0xE6B5, // <cjk> + 0x8C78,0xE6B6, // <cjk> + 0x8C79,0x955E, // <cjk> + 0x8C7A,0xE6B7, // <cjk> + 0x8C7C,0xE6BF, // <cjk> + 0x8C82,0xE6B8, // <cjk> + 0x8C85,0xE6BA, // <cjk> + 0x8C89,0xE6B9, // <cjk> + 0x8C8A,0xE6BB, // <cjk> + 0x8C8C,0x9665, // <cjk> + 0x8C8D,0xE6BC, // <cjk> + 0x8C8E,0xE6BD, // <cjk> + 0x8C94,0xE6BE, // <cjk> + 0x8C98,0xE6C0, // <cjk> + 0x8C9D,0x8A4C, // <cjk> + 0x8C9E,0x92E5, // <cjk> + 0x8CA0,0x9589, // <cjk> + 0x8CA1,0x8DE0, // <cjk> + 0x8CA2,0x8D76, // <cjk> + 0x8CA7,0x956E, // <cjk> + 0x8CA8,0x89DD, // <cjk> + 0x8CA9,0x94CC, // <cjk> + 0x8CAA,0xE6C3, // <cjk> + 0x8CAB,0x8AD1, // <cjk> + 0x8CAC,0x90D3, // <cjk> + 0x8CAD,0xE6C2, // <cjk> + 0x8CAE,0xE6C7, // <cjk> + 0x8CAF,0x9299, // <cjk> + 0x8CB0,0x96E1, // <cjk> + 0x8CB2,0xE6C5, // <cjk> + 0x8CB3,0xE6C6, // <cjk> + 0x8CB4,0x8B4D, // <cjk> + 0x8CB6,0xE6C8, // <cjk> + 0x8CB7,0x9483, // <cjk> + 0x8CB8,0x91DD, // <cjk> + 0x8CBB,0x94EF, // <cjk> + 0x8CBC,0x935C, // <cjk> + 0x8CBD,0xE6C4, // <cjk> + 0x8CBF,0x9666, // <cjk> + 0x8CC0,0x89EA, // <cjk> + 0x8CC1,0xE6CA, // <cjk> + 0x8CC2,0x9847, // <cjk> + 0x8CC3,0x92C0, // <cjk> + 0x8CC4,0x9864, // <cjk> + 0x8CC7,0x8E91, // <cjk> + 0x8CC8,0xE6C9, // <cjk> + 0x8CCA,0x91AF, // <cjk> + 0x8CCD,0xE6DA, // <cjk> + 0x8CCE,0x9147, // <cjk> + 0x8CD1,0x93F6, // <cjk> + 0x8CD3,0x956F, // <cjk> + 0x8CDA,0xE6CD, // <cjk> + 0x8CDB,0x8E5E, // <cjk> + 0x8CDC,0x8E92, // <cjk> + 0x8CDE,0x8FDC, // <cjk> + 0x8CE0,0x9485, // <cjk> + 0x8CE2,0x8CAB, // <cjk> + 0x8CE3,0xE6CC, // <cjk> + 0x8CE4,0xE6CB, // <cjk> + 0x8CE6,0x958A, // <cjk> + 0x8CEA,0x8EBF, // <cjk> + 0x8CED,0x9371, // <cjk> + 0x8CFA,0xE6CF, // <cjk> + 0x8CFB,0xE6D0, // <cjk> + 0x8CFC,0x8D77, // <cjk> + 0x8CFD,0xE6CE, // <cjk> + 0x8D04,0xE6D1, // <cjk> + 0x8D05,0xE6D2, // <cjk> + 0x8D07,0xE6D4, // <cjk> + 0x8D08,0x91A1, // <cjk> + 0x8D0A,0xE6D3, // <cjk> + 0x8D0B,0x8AE4, // <cjk> + 0x8D0D,0xE6D6, // <cjk> + 0x8D0F,0xE6D5, // <cjk> + 0x8D10,0xE6D7, // <cjk> + 0x8D13,0xE6D9, // <cjk> + 0x8D14,0xE6DB, // <cjk> + 0x8D16,0xE6DC, // <cjk> + 0x8D64,0x90D4, // <cjk> + 0x8D66,0x8ECD, // <cjk> + 0x8D67,0xE6DD, // <cjk> + 0x8D6B,0x8A71, // <cjk> + 0x8D6D,0xE6DE, // <cjk> + 0x8D70,0x9196, // <cjk> + 0x8D71,0xE6DF, // <cjk> + 0x8D73,0xE6E0, // <cjk> + 0x8D74,0x958B, // <cjk> + 0x8D77,0x8B4E, // <cjk> + 0x8D81,0xE6E1, // <cjk> + 0x8D85,0x92B4, // <cjk> + 0x8D8A,0x897A, // <cjk> + 0x8D99,0xE6E2, // <cjk> + 0x8DA3,0x8EEF, // <cjk> + 0x8DA8,0x9096, // <cjk> + 0x8DB3,0x91AB, // <cjk> + 0x8DBA,0xE6E5, // <cjk> + 0x8DBE,0xE6E4, // <cjk> + 0x8DC2,0xE6E3, // <cjk> + 0x8DCB,0xE6EB, // <cjk> + 0x8DCC,0xE6E9, // <cjk> + 0x8DCF,0xE6E6, // <cjk> + 0x8DD6,0xE6E8, // <cjk> + 0x8DDA,0xE6E7, // <cjk> + 0x8DDB,0xE6EA, // <cjk> + 0x8DDD,0x8B97, // <cjk> + 0x8DDF,0xE6EE, // <cjk> + 0x8DE1,0x90D5, // <cjk> + 0x8DE3,0xE6EF, // <cjk> + 0x8DE8,0x8CD7, // <cjk> + 0x8DEA,0xE6EC, // <cjk> + 0x8DEB,0xE6ED, // <cjk> + 0x8DEF,0x9848, // <cjk> + 0x8DF3,0x92B5, // <cjk> + 0x8DF5,0x9148, // <cjk> + 0x8DFC,0xE6F0, // <cjk> + 0x8DFF,0xE6F3, // <cjk> + 0x8E08,0xE6F1, // <cjk> + 0x8E09,0xE6F2, // <cjk> + 0x8E0A,0x9778, // <cjk> + 0x8E0F,0x93A5, // <cjk> + 0x8E10,0xE6F6, // <cjk> + 0x8E1D,0xE6F4, // <cjk> + 0x8E1E,0xE6F5, // <cjk> + 0x8E1F,0xE6F7, // <cjk> + 0x8E2A,0xE748, // <cjk> + 0x8E30,0xE6FA, // <cjk> + 0x8E34,0xE6FB, // <cjk> + 0x8E35,0xE6F9, // <cjk> + 0x8E42,0xE6F8, // <cjk> + 0x8E44,0x92FB, // <cjk> + 0x8E47,0xE740, // <cjk> + 0x8E48,0xE744, // <cjk> + 0x8E49,0xE741, // <cjk> + 0x8E4A,0xE6FC, // <cjk> + 0x8E4C,0xE742, // <cjk> + 0x8E50,0xE743, // <cjk> + 0x8E55,0xE74A, // <cjk> + 0x8E59,0xE745, // <cjk> + 0x8E5F,0x90D6, // <cjk> + 0x8E60,0xE747, // <cjk> + 0x8E63,0xE749, // <cjk> + 0x8E64,0xE746, // <cjk> + 0x8E72,0xE74C, // <cjk> + 0x8E74,0x8F52, // <cjk> + 0x8E76,0xE74B, // <cjk> + 0x8E7C,0xE74D, // <cjk> + 0x8E81,0xE74E, // <cjk> + 0x8E84,0xE751, // <cjk> + 0x8E85,0xE750, // <cjk> + 0x8E87,0xE74F, // <cjk> + 0x8E8A,0xE753, // <cjk> + 0x8E8B,0xE752, // <cjk> + 0x8E8D,0x96F4, // <cjk> + 0x8E91,0xE755, // <cjk> + 0x8E93,0xE754, // <cjk> + 0x8E94,0xE756, // <cjk> + 0x8E99,0xE757, // <cjk> + 0x8EA1,0xE759, // <cjk> + 0x8EAA,0xE758, // <cjk> + 0x8EAB,0x9067, // <cjk> + 0x8EAC,0xE75A, // <cjk> + 0x8EAF,0x8BEB, // <cjk> + 0x8EB1,0xE75D, // <cjk> + 0x8EBE,0xE75E, // <cjk> + 0x8EC5,0xE75F, // <cjk> + 0x8EC6,0xE75C, // <cjk> + 0x8EC8,0xE760, // <cjk> + 0x8ECA,0x8ED4, // <cjk> + 0x8ECB,0xE761, // <cjk> + 0x8ECC,0x8B4F, // <cjk> + 0x8ECD,0x8C52, // <cjk> + 0x8ED2,0x8CAC, // <cjk> + 0x8EDB,0xE762, // <cjk> + 0x8EDF,0x93EE, // <cjk> + 0x8EE2,0x935D, // <cjk> + 0x8EE3,0xE763, // <cjk> + 0x8EEB,0xE766, // <cjk> + 0x8EF8,0x8EB2, // <cjk> + 0x8EFB,0xE765, // <cjk> + 0x8EFC,0xE764, // <cjk> + 0x8EFD,0x8C79, // <cjk> + 0x8EFE,0xE767, // <cjk> + 0x8F03,0x8A72, // <cjk> + 0x8F05,0xE769, // <cjk> + 0x8F09,0x8DDA, // <cjk> + 0x8F0A,0xE768, // <cjk> + 0x8F0C,0xE771, // <cjk> + 0x8F12,0xE76B, // <cjk> + 0x8F13,0xE76D, // <cjk> + 0x8F14,0x95E3, // <cjk> + 0x8F15,0xE76A, // <cjk> + 0x8F19,0xE76C, // <cjk> + 0x8F1B,0xE770, // <cjk> + 0x8F1C,0xE76E, // <cjk> + 0x8F1D,0x8B50, // <cjk> + 0x8F1F,0xE76F, // <cjk> + 0x8F26,0xE772, // <cjk> + 0x8F29,0x9479, // <cjk> + 0x8F2A,0x97D6, // <cjk> + 0x8F2F,0x8F53, // <cjk> + 0x8F33,0xE773, // <cjk> + 0x8F38,0x9741, // <cjk> + 0x8F39,0xE775, // <cjk> + 0x8F3B,0xE774, // <cjk> + 0x8F3E,0xE778, // <cjk> + 0x8F3F,0x9760, // <cjk> + 0x8F42,0xE777, // <cjk> + 0x8F44,0x8A8D, // <cjk> + 0x8F45,0xE776, // <cjk> + 0x8F46,0xE77B, // <cjk> + 0x8F49,0xE77A, // <cjk> + 0x8F4C,0xE779, // <cjk> + 0x8F4D,0x9351, // <cjk> + 0x8F4E,0xE77C, // <cjk> + 0x8F57,0xE77D, // <cjk> + 0x8F5C,0xE77E, // <cjk> + 0x8F5F,0x8D8C, // <cjk> + 0x8F61,0x8C44, // <cjk> + 0x8F62,0xE780, // <cjk> + 0x8F63,0xE781, // <cjk> + 0x8F64,0xE782, // <cjk> + 0x8F9B,0x9068, // <cjk> + 0x8F9C,0xE783, // <cjk> + 0x8F9E,0x8EAB, // <cjk> + 0x8F9F,0xE784, // <cjk> + 0x8FA3,0xE785, // <cjk> + 0x8FA7,0x999F, // <cjk> + 0x8FA8,0x999E, // <cjk> + 0x8FAD,0xE786, // <cjk> + 0x8FAE,0xE390, // <cjk> + 0x8FAF,0xE787, // <cjk> + 0x8FB0,0x9243, // <cjk> + 0x8FB1,0x904A, // <cjk> + 0x8FB2,0x945F, // <cjk> + 0x8FB7,0xE788, // <cjk> + 0x8FBA,0x95D3, // <cjk> + 0x8FBB,0x92D2, // <cjk> + 0x8FBC,0x8D9E, // <cjk> + 0x8FBF,0x9248, // <cjk> + 0x8FC2,0x8949, // <cjk> + 0x8FC4,0x9698, // <cjk> + 0x8FC5,0x9076, // <cjk> + 0x8FCE,0x8C7D, // <cjk> + 0x8FD1,0x8BDF, // <cjk> + 0x8FD4,0x95D4, // <cjk> + 0x8FDA,0xE789, // <cjk> + 0x8FE2,0xE78B, // <cjk> + 0x8FE5,0xE78A, // <cjk> + 0x8FE6,0x89DE, // <cjk> + 0x8FE9,0x93F4, // <cjk> + 0x8FEA,0xE78C, // <cjk> + 0x8FEB,0x9497, // <cjk> + 0x8FED,0x9352, // <cjk> + 0x8FEF,0xE78D, // <cjk> + 0x8FF0,0x8F71, // <cjk> + 0x8FF4,0xE78F, // <cjk> + 0x8FF7,0x96C0, // <cjk> + 0x8FF8,0xE79E, // <cjk> + 0x8FF9,0xE791, // <cjk> + 0x8FFA,0xE792, // <cjk> + 0x8FFD,0x92C7, // <cjk> + 0x9000,0x91DE, // <cjk> + 0x9001,0x9197, // <cjk> + 0x9003,0x93A6, // <cjk> + 0x9005,0xE790, // <cjk> + 0x9006,0x8B74, // <cjk> + 0x900B,0xE799, // <cjk> + 0x900D,0xE796, // <cjk> + 0x900E,0xE7A3, // <cjk> + 0x900F,0x93A7, // <cjk> + 0x9010,0x9280, // <cjk> + 0x9011,0xE793, // <cjk> + 0x9013,0x92FC, // <cjk> + 0x9014,0x9372, // <cjk> + 0x9015,0xE794, // <cjk> + 0x9016,0xE798, // <cjk> + 0x9017,0x9080, // <cjk> + 0x9019,0x9487, // <cjk> + 0x901A,0x92CA, // <cjk> + 0x901D,0x90C0, // <cjk> + 0x901E,0xE797, // <cjk> + 0x901F,0x91AC, // <cjk> + 0x9020,0x91A2, // <cjk> + 0x9021,0xE795, // <cjk> + 0x9022,0x88A7, // <cjk> + 0x9023,0x9841, // <cjk> + 0x9027,0xE79A, // <cjk> + 0x902E,0x91DF, // <cjk> + 0x9031,0x8F54, // <cjk> + 0x9032,0x9069, // <cjk> + 0x9035,0xE79C, // <cjk> + 0x9036,0xE79B, // <cjk> + 0x9038,0x88ED, // <cjk> + 0x9039,0xE79D, // <cjk> + 0x903C,0x954E, // <cjk> + 0x903E,0xE7A5, // <cjk> + 0x9041,0x93D9, // <cjk> + 0x9042,0x908B, // <cjk> + 0x9045,0x9278, // <cjk> + 0x9047,0x8BF6, // <cjk> + 0x9049,0xE7A4, // <cjk> + 0x904A,0x9756, // <cjk> + 0x904B,0x895E, // <cjk> + 0x904D,0x95D5, // <cjk> + 0x904E,0x89DF, // <cjk> + 0x904F,0xE79F, // <cjk> + 0x9050,0xE7A0, // <cjk> + 0x9051,0xE7A1, // <cjk> + 0x9052,0xE7A2, // <cjk> + 0x9053,0x93B9, // <cjk> + 0x9054,0x9242, // <cjk> + 0x9055,0x88E1, // <cjk> + 0x9056,0xE7A6, // <cjk> + 0x9058,0xE7A7, // <cjk> + 0x9059,0xEAA1, // <cjk> + 0x905C,0x91BB, // <cjk> + 0x905E,0xE7A8, // <cjk> + 0x9060,0x8993, // <cjk> + 0x9061,0x916B, // <cjk> + 0x9063,0x8CAD, // <cjk> + 0x9065,0x9779, // <cjk> + 0x9068,0xE7A9, // <cjk> + 0x9069,0x934B, // <cjk> + 0x906D,0x9198, // <cjk> + 0x906E,0x8ED5, // <cjk> + 0x906F,0xE7AA, // <cjk> + 0x9072,0xE7AD, // <cjk> + 0x9075,0x8F85, // <cjk> + 0x9076,0xE7AB, // <cjk> + 0x9077,0x914A, // <cjk> + 0x9078,0x9149, // <cjk> + 0x907A,0x88E2, // <cjk> + 0x907C,0x97C9, // <cjk> + 0x907D,0xE7AF, // <cjk> + 0x907F,0x94F0, // <cjk> + 0x9080,0xE7B1, // <cjk> + 0x9081,0xE7B0, // <cjk> + 0x9082,0xE7AE, // <cjk> + 0x9083,0xE284, // <cjk> + 0x9084,0x8AD2, // <cjk> + 0x9087,0xE78E, // <cjk> + 0x9089,0xE7B3, // <cjk> + 0x908A,0xE7B2, // <cjk> + 0x908F,0xE7B4, // <cjk> + 0x9091,0x9757, // <cjk> + 0x90A3,0x93DF, // <cjk> + 0x90A6,0x964D, // <cjk> + 0x90A8,0xE7B5, // <cjk> + 0x90AA,0x8ED7, // <cjk> + 0x90AF,0xE7B6, // <cjk> + 0x90B1,0xE7B7, // <cjk> + 0x90B5,0xE7B8, // <cjk> + 0x90B8,0x9340, // <cjk> + 0x90C1,0x88E8, // <cjk> + 0x90CA,0x8D78, // <cjk> + 0x90CE,0x9859, // <cjk> + 0x90DB,0xE7BC, // <cjk> + 0x90E1,0x8C53, // <cjk> + 0x90E2,0xE7B9, // <cjk> + 0x90E4,0xE7BA, // <cjk> + 0x90E8,0x9594, // <cjk> + 0x90ED,0x8A73, // <cjk> + 0x90F5,0x9758, // <cjk> + 0x90F7,0x8BBD, // <cjk> + 0x90FD,0x9373, // <cjk> + 0x9102,0xE7BD, // <cjk> + 0x9112,0xE7BE, // <cjk> + 0x9119,0xE7BF, // <cjk> + 0x912D,0x9341, // <cjk> + 0x9130,0xE7C1, // <cjk> + 0x9132,0xE7C0, // <cjk> + 0x9149,0x93D1, // <cjk> + 0x914A,0xE7C2, // <cjk> + 0x914B,0x8F55, // <cjk> + 0x914C,0x8EDE, // <cjk> + 0x914D,0x947A, // <cjk> + 0x914E,0x9291, // <cjk> + 0x9152,0x8EF0, // <cjk> + 0x9154,0x908C, // <cjk> + 0x9156,0xE7C3, // <cjk> + 0x9158,0xE7C4, // <cjk> + 0x9162,0x907C, // <cjk> + 0x9163,0xE7C5, // <cjk> + 0x9165,0xE7C6, // <cjk> + 0x9169,0xE7C7, // <cjk> + 0x916A,0x978F, // <cjk> + 0x916C,0x8F56, // <cjk> + 0x9172,0xE7C9, // <cjk> + 0x9173,0xE7C8, // <cjk> + 0x9175,0x8D79, // <cjk> + 0x9177,0x8D93, // <cjk> + 0x9178,0x8E5F, // <cjk> + 0x9182,0xE7CC, // <cjk> + 0x9187,0x8F86, // <cjk> + 0x9189,0xE7CB, // <cjk> + 0x918B,0xE7CA, // <cjk> + 0x918D,0x91E7, // <cjk> + 0x9190,0x8CED, // <cjk> + 0x9192,0x90C1, // <cjk> + 0x9197,0x94AE, // <cjk> + 0x919C,0x8F58, // <cjk> + 0x91A2,0xE7CD, // <cjk> + 0x91A4,0x8FDD, // <cjk> + 0x91AA,0xE7D0, // <cjk> + 0x91AB,0xE7CE, // <cjk> + 0x91AF,0xE7CF, // <cjk> + 0x91B4,0xE7D2, // <cjk> + 0x91B5,0xE7D1, // <cjk> + 0x91B8,0x8FF8, // <cjk> + 0x91BA,0xE7D3, // <cjk> + 0x91C0,0xE7D4, // <cjk> + 0x91C1,0xE7D5, // <cjk> + 0x91C6,0x94CE, // <cjk> + 0x91C7,0x8DD1, // <cjk> + 0x91C8,0x8EDF, // <cjk> + 0x91C9,0xE7D6, // <cjk> + 0x91CB,0xE7D7, // <cjk> + 0x91CC,0x97A2, // <cjk> + 0x91CD,0x8F64, // <cjk> + 0x91CE,0x96EC, // <cjk> + 0x91CF,0x97CA, // <cjk> + 0x91D0,0xE7D8, // <cjk> + 0x91D1,0x8BE0, // <cjk> + 0x91D6,0xE7D9, // <cjk> + 0x91D8,0x9342, // <cjk> + 0x91DB,0xE7DC, // <cjk> + 0x91DC,0x8A98, // <cjk> + 0x91DD,0x906A, // <cjk> + 0x91DF,0xE7DA, // <cjk> + 0x91E1,0xE7DB, // <cjk> + 0x91E3,0x92DE, // <cjk> + 0x91E6,0x9674, // <cjk> + 0x91E7,0x8BFA, // <cjk> + 0x91F5,0xE7DE, // <cjk> + 0x91F6,0xE7DF, // <cjk> + 0x91FC,0xE7DD, // <cjk> + 0x91FF,0xE7E1, // <cjk> + 0x920D,0x93DD, // <cjk> + 0x920E,0x8A62, // <cjk> + 0x9211,0xE7E5, // <cjk> + 0x9214,0xE7E2, // <cjk> + 0x9215,0xE7E4, // <cjk> + 0x921E,0xE7E0, // <cjk> + 0x9229,0xE86E, // <cjk> + 0x922C,0xE7E3, // <cjk> + 0x9234,0x97E9, // <cjk> + 0x9237,0x8CD8, // <cjk> + 0x923F,0xE7ED, // <cjk> + 0x9244,0x9353, // <cjk> + 0x9245,0xE7E8, // <cjk> + 0x9248,0xE7EB, // <cjk> + 0x9249,0xE7E9, // <cjk> + 0x924B,0xE7EE, // <cjk> + 0x9250,0xE7EF, // <cjk> + 0x9257,0xE7E7, // <cjk> + 0x925A,0xE7F4, // <cjk> + 0x925B,0x8994, // <cjk> + 0x925E,0xE7E6, // <cjk> + 0x9262,0x94AB, // <cjk> + 0x9264,0xE7EA, // <cjk> + 0x9266,0x8FDE, // <cjk> + 0x9271,0x8D7A, // <cjk> + 0x927E,0x9667, // <cjk> + 0x9280,0x8BE2, // <cjk> + 0x9283,0x8F65, // <cjk> + 0x9285,0x93BA, // <cjk> + 0x9291,0x914C, // <cjk> + 0x9293,0xE7F2, // <cjk> + 0x9295,0xE7EC, // <cjk> + 0x9296,0xE7F1, // <cjk> + 0x9298,0x96C1, // <cjk> + 0x929A,0x92B6, // <cjk> + 0x929B,0xE7F3, // <cjk> + 0x929C,0xE7F0, // <cjk> + 0x92AD,0x914B, // <cjk> + 0x92B7,0xE7F7, // <cjk> + 0x92B9,0xE7F6, // <cjk> + 0x92CF,0xE7F5, // <cjk> + 0x92D2,0x964E, // <cjk> + 0x92E4,0x8F9B, // <cjk> + 0x92E9,0xE7F8, // <cjk> + 0x92EA,0x95DD, // <cjk> + 0x92ED,0x8973, // <cjk> + 0x92F2,0x9565, // <cjk> + 0x92F3,0x9292, // <cjk> + 0x92F8,0x8B98, // <cjk> + 0x92FA,0xE7FA, // <cjk> + 0x92FC,0x8D7C, // <cjk> + 0x9306,0x8E4B, // <cjk> + 0x930F,0xE7F9, // <cjk> + 0x9310,0x908D, // <cjk> + 0x9318,0x908E, // <cjk> + 0x9319,0xE840, // <cjk> + 0x931A,0xE842, // <cjk> + 0x9320,0x8FF9, // <cjk> + 0x9322,0xE841, // <cjk> + 0x9323,0xE843, // <cjk> + 0x9326,0x8BD1, // <cjk> + 0x9328,0x9564, // <cjk> + 0x932B,0x8EE0, // <cjk> + 0x932C,0x9842, // <cjk> + 0x932E,0xE7FC, // <cjk> + 0x932F,0x8DF6, // <cjk> + 0x9332,0x985E, // <cjk> + 0x9335,0xE845, // <cjk> + 0x933A,0xE844, // <cjk> + 0x933B,0xE846, // <cjk> + 0x9344,0xE7FB, // <cjk> + 0x934B,0x93E7, // <cjk> + 0x934D,0x9374, // <cjk> + 0x9354,0x92D5, // <cjk> + 0x9356,0xE84B, // <cjk> + 0x935B,0x9262, // <cjk> + 0x935C,0xE847, // <cjk> + 0x9360,0xE848, // <cjk> + 0x936C,0x8C4C, // <cjk> + 0x936E,0xE84A, // <cjk> + 0x9375,0x8CAE, // <cjk> + 0x937C,0xE849, // <cjk> + 0x937E,0x8FDF, // <cjk> + 0x938C,0x8A99, // <cjk> + 0x9394,0xE84F, // <cjk> + 0x9396,0x8DBD, // <cjk> + 0x9397,0x9199, // <cjk> + 0x939A,0x92C8, // <cjk> + 0x93A7,0x8A5A, // <cjk> + 0x93AC,0xE84D, // <cjk> + 0x93AD,0xE84E, // <cjk> + 0x93AE,0x92C1, // <cjk> + 0x93B0,0xE84C, // <cjk> + 0x93B9,0xE850, // <cjk> + 0x93C3,0xE856, // <cjk> + 0x93C8,0xE859, // <cjk> + 0x93D0,0xE858, // <cjk> + 0x93D1,0x934C, // <cjk> + 0x93D6,0xE851, // <cjk> + 0x93D7,0xE852, // <cjk> + 0x93D8,0xE855, // <cjk> + 0x93DD,0xE857, // <cjk> + 0x93E1,0x8BBE, // <cjk> + 0x93E4,0xE85A, // <cjk> + 0x93E5,0xE854, // <cjk> + 0x93E8,0xE853, // <cjk> + 0x9403,0xE85E, // <cjk> + 0x9407,0xE85F, // <cjk> + 0x9410,0xE860, // <cjk> + 0x9413,0xE85D, // <cjk> + 0x9414,0xE85C, // <cjk> + 0x9418,0x8FE0, // <cjk> + 0x9419,0x93A8, // <cjk> + 0x9421,0xE864, // <cjk> + 0x942B,0xE862, // <cjk> + 0x9435,0xE863, // <cjk> + 0x9436,0xE861, // <cjk> + 0x9438,0x91F6, // <cjk> + 0x943A,0xE865, // <cjk> + 0x9441,0xE866, // <cjk> + 0x9444,0xE868, // <cjk> + 0x9451,0x8AD3, // <cjk> + 0x9452,0xE867, // <cjk> + 0x9453,0x96F8, // <cjk> + 0x945A,0xE873, // <cjk> + 0x945B,0xE869, // <cjk> + 0x945E,0xE86C, // <cjk> + 0x9460,0xE86A, // <cjk> + 0x9462,0xE86B, // <cjk> + 0x946A,0xE86D, // <cjk> + 0x9470,0xE86F, // <cjk> + 0x9475,0xE870, // <cjk> + 0x9477,0xE871, // <cjk> + 0x947C,0xE874, // <cjk> + 0x947D,0xE872, // <cjk> + 0x947E,0xE875, // <cjk> + 0x947F,0xE877, // <cjk> + 0x9481,0xE876, // <cjk> + 0x9577,0x92B7, // <cjk> + 0x9580,0x96E5, // <cjk> + 0x9582,0xE878, // <cjk> + 0x9583,0x914D, // <cjk> + 0x9587,0xE879, // <cjk> + 0x9589,0x95C2, // <cjk> + 0x958A,0xE87A, // <cjk> + 0x958B,0x8A4A, // <cjk> + 0x9591,0x8AD5, // <cjk> + 0x9593,0x8AD4, // <cjk> + 0x9594,0xE87B, // <cjk> + 0x9596,0xE87C, // <cjk> + 0x9598,0xE87D, // <cjk> + 0x9599,0xE87E, // <cjk> + 0x95A0,0xE880, // <cjk> + 0x95A2,0x8AD6, // <cjk> + 0x95A3,0x8A74, // <cjk> + 0x95A4,0x8D7D, // <cjk> + 0x95A5,0x94B4, // <cjk> + 0x95A7,0xE882, // <cjk> + 0x95A8,0xE881, // <cjk> + 0x95AD,0xE883, // <cjk> + 0x95B2,0x897B, // <cjk> + 0x95B9,0xE886, // <cjk> + 0x95BB,0xE885, // <cjk> + 0x95BC,0xE884, // <cjk> + 0x95BE,0xE887, // <cjk> + 0x95C3,0xE88A, // <cjk> + 0x95C7,0x88C5, // <cjk> + 0x95CA,0xE888, // <cjk> + 0x95CC,0xE88C, // <cjk> + 0x95CD,0xE88B, // <cjk> + 0x95D4,0xE88E, // <cjk> + 0x95D5,0xE88D, // <cjk> + 0x95D6,0xE88F, // <cjk> + 0x95D8,0x93AC, // <cjk> + 0x95DC,0xE890, // <cjk> + 0x95E1,0xE891, // <cjk> + 0x95E2,0xE893, // <cjk> + 0x95E5,0xE892, // <cjk> + 0x961C,0x958C, // <cjk> + 0x9621,0xE894, // <cjk> + 0x9628,0xE895, // <cjk> + 0x962A,0x8DE3, // <cjk> + 0x962E,0xE896, // <cjk> + 0x962F,0xE897, // <cjk> + 0x9632,0x9668, // <cjk> + 0x963B,0x916A, // <cjk> + 0x963F,0x88A2, // <cjk> + 0x9640,0x91C9, // <cjk> + 0x9642,0xE898, // <cjk> + 0x9644,0x958D, // <cjk> + 0x964B,0xE89B, // <cjk> + 0x964C,0xE899, // <cjk> + 0x964D,0x8D7E, // <cjk> + 0x964F,0xE89A, // <cjk> + 0x9650,0x8CC0, // <cjk> + 0x965B,0x95C3, // <cjk> + 0x965C,0xE89D, // <cjk> + 0x965D,0xE89F, // <cjk> + 0x965E,0xE89E, // <cjk> + 0x965F,0xE8A0, // <cjk> + 0x9662,0x8940, // <cjk> + 0x9663,0x9077, // <cjk> + 0x9664,0x8F9C, // <cjk> + 0x9665,0x8AD7, // <cjk> + 0x9666,0xE8A1, // <cjk> + 0x966A,0x9486, // <cjk> + 0x966C,0xE8A3, // <cjk> + 0x9670,0x8941, // <cjk> + 0x9672,0xE8A2, // <cjk> + 0x9673,0x92C2, // <cjk> + 0x9675,0x97CB, // <cjk> + 0x9676,0x93A9, // <cjk> + 0x9677,0xE89C, // <cjk> + 0x9678,0x97A4, // <cjk> + 0x967A,0x8CAF, // <cjk> + 0x967D,0x977A, // <cjk> + 0x9685,0x8BF7, // <cjk> + 0x9686,0x97B2, // <cjk> + 0x9688,0x8C47, // <cjk> + 0x968A,0x91E0, // <cjk> + 0x968B,0xE440, // <cjk> + 0x968D,0xE8A4, // <cjk> + 0x968E,0x8A4B, // <cjk> + 0x968F,0x908F, // <cjk> + 0x9694,0x8A75, // <cjk> + 0x9695,0xE8A6, // <cjk> + 0x9697,0xE8A7, // <cjk> + 0x9698,0xE8A5, // <cjk> + 0x9699,0x8C84, // <cjk> + 0x969B,0x8DDB, // <cjk> + 0x969C,0x8FE1, // <cjk> + 0x96A0,0x8942, // <cjk> + 0x96A3,0x97D7, // <cjk> + 0x96A7,0xE8A9, // <cjk> + 0x96A8,0xE7AC, // <cjk> + 0x96AA,0xE8A8, // <cjk> + 0x96B0,0xE8AC, // <cjk> + 0x96B1,0xE8AA, // <cjk> + 0x96B2,0xE8AB, // <cjk> + 0x96B4,0xE8AD, // <cjk> + 0x96B6,0xE8AE, // <cjk> + 0x96B7,0x97EA, // <cjk> + 0x96B8,0xE8AF, // <cjk> + 0x96B9,0xE8B0, // <cjk> + 0x96BB,0x90C7, // <cjk> + 0x96BC,0x94B9, // <cjk> + 0x96C0,0x909D, // <cjk> + 0x96C1,0x8AE5, // <cjk> + 0x96C4,0x9759, // <cjk> + 0x96C5,0x89EB, // <cjk> + 0x96C6,0x8F57, // <cjk> + 0x96C7,0x8CD9, // <cjk> + 0x96C9,0xE8B3, // <cjk> + 0x96CB,0xE8B2, // <cjk> + 0x96CC,0x8E93, // <cjk> + 0x96CD,0xE8B4, // <cjk> + 0x96CE,0xE8B1, // <cjk> + 0x96D1,0x8E47, // <cjk> + 0x96D5,0xE8B8, // <cjk> + 0x96D6,0xE5AB, // <cjk> + 0x96D9,0x99D4, // <cjk> + 0x96DB,0x9097, // <cjk> + 0x96DC,0xE8B6, // <cjk> + 0x96E2,0x97A3, // <cjk> + 0x96E3,0x93EF, // <cjk> + 0x96E8,0x894A, // <cjk> + 0x96EA,0x90E1, // <cjk> + 0x96EB,0x8EB4, // <cjk> + 0x96F0,0x95B5, // <cjk> + 0x96F2,0x895F, // <cjk> + 0x96F6,0x97EB, // <cjk> + 0x96F7,0x978B, // <cjk> + 0x96F9,0xE8B9, // <cjk> + 0x96FB,0x9364, // <cjk> + 0x9700,0x8EF9, // <cjk> + 0x9704,0xE8BA, // <cjk> + 0x9706,0xE8BB, // <cjk> + 0x9707,0x906B, // <cjk> + 0x9708,0xE8BC, // <cjk> + 0x970A,0x97EC, // <cjk> + 0x970D,0xE8B7, // <cjk> + 0x970E,0xE8BE, // <cjk> + 0x970F,0xE8C0, // <cjk> + 0x9711,0xE8BF, // <cjk> + 0x9713,0xE8BD, // <cjk> + 0x9716,0xE8C1, // <cjk> + 0x9719,0xE8C2, // <cjk> + 0x971C,0x919A, // <cjk> + 0x971E,0x89E0, // <cjk> + 0x9724,0xE8C3, // <cjk> + 0x9727,0x96B6, // <cjk> + 0x972A,0xE8C4, // <cjk> + 0x9730,0xE8C5, // <cjk> + 0x9732,0x9849, // <cjk> + 0x9738,0x9E50, // <cjk> + 0x9739,0xE8C6, // <cjk> + 0x973D,0xE8C7, // <cjk> + 0x973E,0xE8C8, // <cjk> + 0x9742,0xE8CC, // <cjk> + 0x9744,0xE8C9, // <cjk> + 0x9746,0xE8CA, // <cjk> + 0x9748,0xE8CB, // <cjk> + 0x9749,0xE8CD, // <cjk> + 0x9752,0x90C2, // <cjk> + 0x9756,0x96F5, // <cjk> + 0x9759,0x90C3, // <cjk> + 0x975C,0xE8CE, // <cjk> + 0x975E,0x94F1, // <cjk> + 0x9760,0xE8CF, // <cjk> + 0x9761,0xEA72, // <cjk> + 0x9762,0x96CA, // <cjk> + 0x9764,0xE8D0, // <cjk> + 0x9766,0xE8D1, // <cjk> + 0x9768,0xE8D2, // <cjk> + 0x9769,0x8A76, // <cjk> + 0x976B,0xE8D4, // <cjk> + 0x976D,0x9078, // <cjk> + 0x9771,0xE8D5, // <cjk> + 0x9774,0x8C43, // <cjk> + 0x9779,0xE8D6, // <cjk> + 0x977A,0xE8DA, // <cjk> + 0x977C,0xE8D8, // <cjk> + 0x9781,0xE8D9, // <cjk> + 0x9784,0x8A93, // <cjk> + 0x9785,0xE8D7, // <cjk> + 0x9786,0xE8DB, // <cjk> + 0x978B,0xE8DC, // <cjk> + 0x978D,0x88C6, // <cjk> + 0x978F,0xE8DD, // <cjk> + 0x9790,0xE8DE, // <cjk> + 0x9798,0x8FE2, // <cjk> + 0x979C,0xE8DF, // <cjk> + 0x97A0,0x8B66, // <cjk> + 0x97A3,0xE8E2, // <cjk> + 0x97A6,0xE8E1, // <cjk> + 0x97A8,0xE8E0, // <cjk> + 0x97AB,0xE691, // <cjk> + 0x97AD,0x95DA, // <cjk> + 0x97B3,0xE8E3, // <cjk> + 0x97B4,0xE8E4, // <cjk> + 0x97C3,0xE8E5, // <cjk> + 0x97C6,0xE8E6, // <cjk> + 0x97C8,0xE8E7, // <cjk> + 0x97CB,0xE8E8, // <cjk> + 0x97D3,0x8AD8, // <cjk> + 0x97DC,0xE8E9, // <cjk> + 0x97ED,0xE8EA, // <cjk> + 0x97EE,0x9442, // <cjk> + 0x97F2,0xE8EC, // <cjk> + 0x97F3,0x89B9, // <cjk> + 0x97F5,0xE8EF, // <cjk> + 0x97F6,0xE8EE, // <cjk> + 0x97FB,0x8943, // <cjk> + 0x97FF,0x8BBF, // <cjk> + 0x9801,0x95C5, // <cjk> + 0x9802,0x92B8, // <cjk> + 0x9803,0x8DA0, // <cjk> + 0x9805,0x8D80, // <cjk> + 0x9806,0x8F87, // <cjk> + 0x9808,0x907B, // <cjk> + 0x980C,0xE8F1, // <cjk> + 0x980F,0xE8F0, // <cjk> + 0x9810,0x9761, // <cjk> + 0x9811,0x8AE6, // <cjk> + 0x9812,0x94D0, // <cjk> + 0x9813,0x93DA, // <cjk> + 0x9817,0x909C, // <cjk> + 0x9818,0x97CC, // <cjk> + 0x981A,0x8C7A, // <cjk> + 0x9821,0xE8F4, // <cjk> + 0x9824,0xE8F3, // <cjk> + 0x982C,0x966A, // <cjk> + 0x982D,0x93AA, // <cjk> + 0x9834,0x896F, // <cjk> + 0x9837,0xE8F5, // <cjk> + 0x9838,0xE8F2, // <cjk> + 0x983B,0x9570, // <cjk> + 0x983C,0x978A, // <cjk> + 0x983D,0xE8F6, // <cjk> + 0x9846,0xE8F7, // <cjk> + 0x984B,0xE8F9, // <cjk> + 0x984C,0x91E8, // <cjk> + 0x984D,0x8A7A, // <cjk> + 0x984E,0x8A7B, // <cjk> + 0x984F,0xE8F8, // <cjk> + 0x9854,0x8AE7, // <cjk> + 0x9855,0x8CB0, // <cjk> + 0x9858,0x8AE8, // <cjk> + 0x985B,0x935E, // <cjk> + 0x985E,0x97DE, // <cjk> + 0x9867,0x8CDA, // <cjk> + 0x986B,0xE8FA, // <cjk> + 0x986F,0xE8FB, // <cjk> + 0x9870,0xE8FC, // <cjk> + 0x9871,0xE940, // <cjk> + 0x9873,0xE942, // <cjk> + 0x9874,0xE941, // <cjk> + 0x98A8,0x9597, // <cjk> + 0x98AA,0xE943, // <cjk> + 0x98AF,0xE944, // <cjk> + 0x98B1,0xE945, // <cjk> + 0x98B6,0xE946, // <cjk> + 0x98C3,0xE948, // <cjk> + 0x98C4,0xE947, // <cjk> + 0x98C6,0xE949, // <cjk> + 0x98DB,0x94F2, // <cjk> + 0x98DC,0xE3CA, // <cjk> + 0x98DF,0x9048, // <cjk> + 0x98E2,0x8B51, // <cjk> + 0x98E9,0xE94A, // <cjk> + 0x98EB,0xE94B, // <cjk> + 0x98ED,0x99AA, // <cjk> + 0x98EE,0x9F5A, // <cjk> + 0x98EF,0x94D1, // <cjk> + 0x98F2,0x88F9, // <cjk> + 0x98F4,0x88B9, // <cjk> + 0x98FC,0x8E94, // <cjk> + 0x98FD,0x964F, // <cjk> + 0x98FE,0x8FFC, // <cjk> + 0x9903,0xE94C, // <cjk> + 0x9905,0x96DD, // <cjk> + 0x9909,0xE94D, // <cjk> + 0x990A,0x977B, // <cjk> + 0x990C,0x8961, // <cjk> + 0x9910,0x8E60, // <cjk> + 0x9912,0xE94E, // <cjk> + 0x9913,0x89EC, // <cjk> + 0x9914,0xE94F, // <cjk> + 0x9918,0xE950, // <cjk> + 0x991D,0xE952, // <cjk> + 0x991E,0xE953, // <cjk> + 0x9920,0xE955, // <cjk> + 0x9921,0xE951, // <cjk> + 0x9924,0xE954, // <cjk> + 0x9928,0x8AD9, // <cjk> + 0x992C,0xE956, // <cjk> + 0x992E,0xE957, // <cjk> + 0x993D,0xE958, // <cjk> + 0x993E,0xE959, // <cjk> + 0x9942,0xE95A, // <cjk> + 0x9945,0xE95C, // <cjk> + 0x994B,0xE95E, // <cjk> + 0x994C,0xE961, // <cjk> + 0x9950,0xE95D, // <cjk> + 0x9951,0xE95F, // <cjk> + 0x9952,0xE960, // <cjk> + 0x9955,0xE962, // <cjk> + 0x9957,0x8BC0, // <cjk> + 0x9996,0x8EF1, // <cjk> + 0x9997,0xE963, // <cjk> + 0x9998,0xE964, // <cjk> + 0x9999,0x8D81, // <cjk> + 0x99A5,0xE965, // <cjk> + 0x99A8,0x8A5D, // <cjk> + 0x99AC,0x946E, // <cjk> + 0x99AD,0xE966, // <cjk> + 0x99AE,0xE967, // <cjk> + 0x99B3,0x9279, // <cjk> + 0x99B4,0x93E9, // <cjk> + 0x99BC,0xE968, // <cjk> + 0x99C1,0x949D, // <cjk> + 0x99C4,0x91CA, // <cjk> + 0x99C5,0x8977, // <cjk> + 0x99C6,0x8BEC, // <cjk> + 0x99C8,0x8BED, // <cjk> + 0x99D0,0x9293, // <cjk> + 0x99D1,0xE96D, // <cjk> + 0x99D2,0x8BEE, // <cjk> + 0x99D5,0x89ED, // <cjk> + 0x99D8,0xE96C, // <cjk> + 0x99DB,0xE96A, // <cjk> + 0x99DD,0xE96B, // <cjk> + 0x99DF,0xE969, // <cjk> + 0x99E2,0xE977, // <cjk> + 0x99ED,0xE96E, // <cjk> + 0x99EE,0xE96F, // <cjk> + 0x99F1,0xE970, // <cjk> + 0x99F2,0xE971, // <cjk> + 0x99F8,0xE973, // <cjk> + 0x99FB,0xE972, // <cjk> + 0x99FF,0x8F78, // <cjk> + 0x9A01,0xE974, // <cjk> + 0x9A05,0xE976, // <cjk> + 0x9A0E,0x8B52, // <cjk> + 0x9A0F,0xE975, // <cjk> + 0x9A12,0x919B, // <cjk> + 0x9A13,0x8CB1, // <cjk> + 0x9A19,0xE978, // <cjk> + 0x9A28,0x91CB, // <cjk> + 0x9A2B,0xE979, // <cjk> + 0x9A30,0x93AB, // <cjk> + 0x9A37,0xE97A, // <cjk> + 0x9A3E,0xE980, // <cjk> + 0x9A40,0xE97D, // <cjk> + 0x9A42,0xE97C, // <cjk> + 0x9A43,0xE97E, // <cjk> + 0x9A45,0xE97B, // <cjk> + 0x9A4D,0xE982, // <cjk> + 0x9A55,0xE981, // <cjk> + 0x9A57,0xE984, // <cjk> + 0x9A5A,0x8BC1, // <cjk> + 0x9A5B,0xE983, // <cjk> + 0x9A5F,0xE985, // <cjk> + 0x9A62,0xE986, // <cjk> + 0x9A64,0xE988, // <cjk> + 0x9A65,0xE987, // <cjk> + 0x9A69,0xE989, // <cjk> + 0x9A6A,0xE98B, // <cjk> + 0x9A6B,0xE98A, // <cjk> + 0x9AA8,0x8D9C, // <cjk> + 0x9AAD,0xE98C, // <cjk> + 0x9AB0,0xE98D, // <cjk> + 0x9ABC,0xE98E, // <cjk> + 0x9AC0,0xE98F, // <cjk> + 0x9AC4,0x9091, // <cjk> + 0x9ACF,0xE990, // <cjk> + 0x9AD1,0xE991, // <cjk> + 0x9AD3,0xE992, // <cjk> + 0x9AD4,0xE993, // <cjk> + 0x9AD8,0x8D82, // <cjk> + 0x9ADE,0xE994, // <cjk> + 0x9ADF,0xE995, // <cjk> + 0x9AE2,0xE996, // <cjk> + 0x9AE3,0xE997, // <cjk> + 0x9AE6,0xE998, // <cjk> + 0x9AEA,0x94AF, // <cjk> + 0x9AEB,0xE99A, // <cjk> + 0x9AED,0x9545, // <cjk> + 0x9AEE,0xE99B, // <cjk> + 0x9AEF,0xE999, // <cjk> + 0x9AF1,0xE99D, // <cjk> + 0x9AF4,0xE99C, // <cjk> + 0x9AF7,0xE99E, // <cjk> + 0x9AFB,0xE99F, // <cjk> + 0x9B06,0xE9A0, // <cjk> + 0x9B18,0xE9A1, // <cjk> + 0x9B1A,0xE9A2, // <cjk> + 0x9B1F,0xE9A3, // <cjk> + 0x9B22,0xE9A4, // <cjk> + 0x9B23,0xE9A5, // <cjk> + 0x9B25,0xE9A6, // <cjk> + 0x9B27,0xE9A7, // <cjk> + 0x9B28,0xE9A8, // <cjk> + 0x9B29,0xE9A9, // <cjk> + 0x9B2A,0xE9AA, // <cjk> + 0x9B2E,0xE9AB, // <cjk> + 0x9B2F,0xE9AC, // <cjk> + 0x9B31,0x9F54, // <cjk> + 0x9B32,0xE9AD, // <cjk> + 0x9B3B,0xE2F6, // <cjk> + 0x9B3C,0x8B53, // <cjk> + 0x9B41,0x8A40, // <cjk> + 0x9B42,0x8DB0, // <cjk> + 0x9B43,0xE9AF, // <cjk> + 0x9B44,0xE9AE, // <cjk> + 0x9B45,0x96A3, // <cjk> + 0x9B4D,0xE9B1, // <cjk> + 0x9B4E,0xE9B2, // <cjk> + 0x9B4F,0xE9B0, // <cjk> + 0x9B51,0xE9B3, // <cjk> + 0x9B54,0x9682, // <cjk> + 0x9B58,0xE9B4, // <cjk> + 0x9B5A,0x8B9B, // <cjk> + 0x9B6F,0x9844, // <cjk> + 0x9B74,0xE9B5, // <cjk> + 0x9B83,0xE9B7, // <cjk> + 0x9B8E,0x88BC, // <cjk> + 0x9B91,0xE9B8, // <cjk> + 0x9B92,0x95A9, // <cjk> + 0x9B93,0xE9B6, // <cjk> + 0x9B96,0xE9B9, // <cjk> + 0x9B97,0xE9BA, // <cjk> + 0x9B9F,0xE9BB, // <cjk> + 0x9BA0,0xE9BC, // <cjk> + 0x9BA8,0xE9BD, // <cjk> + 0x9BAA,0x968E, // <cjk> + 0x9BAB,0x8E4C, // <cjk> + 0x9BAD,0x8DF8, // <cjk> + 0x9BAE,0x914E, // <cjk> + 0x9BB4,0xE9BE, // <cjk> + 0x9BB9,0xE9C1, // <cjk> + 0x9BC0,0xE9BF, // <cjk> + 0x9BC6,0xE9C2, // <cjk> + 0x9BC9,0x8CEF, // <cjk> + 0x9BCA,0xE9C0, // <cjk> + 0x9BCF,0xE9C3, // <cjk> + 0x9BD1,0xE9C4, // <cjk> + 0x9BD2,0xE9C5, // <cjk> + 0x9BD4,0xE9C9, // <cjk> + 0x9BD6,0x8E49, // <cjk> + 0x9BDB,0x91E2, // <cjk> + 0x9BE1,0xE9CA, // <cjk> + 0x9BE2,0xE9C7, // <cjk> + 0x9BE3,0xE9C6, // <cjk> + 0x9BE4,0xE9C8, // <cjk> + 0x9BE8,0x8C7E, // <cjk> + 0x9BF0,0xE9CE, // <cjk> + 0x9BF1,0xE9CD, // <cjk> + 0x9BF2,0xE9CC, // <cjk> + 0x9BF5,0x88B1, // <cjk> + 0x9C04,0xE9D8, // <cjk> + 0x9C06,0xE9D4, // <cjk> + 0x9C08,0xE9D5, // <cjk> + 0x9C09,0xE9D1, // <cjk> + 0x9C0A,0xE9D7, // <cjk> + 0x9C0C,0xE9D3, // <cjk> + 0x9C0D,0x8A82, // <cjk> + 0x9C10,0x986B, // <cjk> + 0x9C12,0xE9D6, // <cjk> + 0x9C13,0xE9D2, // <cjk> + 0x9C14,0xE9D0, // <cjk> + 0x9C15,0xE9CF, // <cjk> + 0x9C1B,0xE9DA, // <cjk> + 0x9C21,0xE9DD, // <cjk> + 0x9C24,0xE9DC, // <cjk> + 0x9C25,0xE9DB, // <cjk> + 0x9C2D,0x9568, // <cjk> + 0x9C2E,0xE9D9, // <cjk> + 0x9C2F,0x88F1, // <cjk> + 0x9C30,0xE9DE, // <cjk> + 0x9C32,0xE9E0, // <cjk> + 0x9C39,0x8A8F, // <cjk> + 0x9C3A,0xE9CB, // <cjk> + 0x9C3B,0x8956, // <cjk> + 0x9C3E,0xE9E2, // <cjk> + 0x9C46,0xE9E1, // <cjk> + 0x9C47,0xE9DF, // <cjk> + 0x9C48,0x924C, // <cjk> + 0x9C52,0x9690, // <cjk> + 0x9C57,0x97D8, // <cjk> + 0x9C5A,0xE9E3, // <cjk> + 0x9C60,0xE9E4, // <cjk> + 0x9C67,0xE9E5, // <cjk> + 0x9C76,0xE9E6, // <cjk> + 0x9C78,0xE9E7, // <cjk> + 0x9CE5,0x92B9, // <cjk> + 0x9CE7,0xE9E8, // <cjk> + 0x9CE9,0x94B5, // <cjk> + 0x9CEB,0xE9ED, // <cjk> + 0x9CEC,0xE9E9, // <cjk> + 0x9CF0,0xE9EA, // <cjk> + 0x9CF3,0x9650, // <cjk> + 0x9CF4,0x96C2, // <cjk> + 0x9CF6,0x93CE, // <cjk> + 0x9D03,0xE9EE, // <cjk> + 0x9D06,0xE9EF, // <cjk> + 0x9D07,0x93BC, // <cjk> + 0x9D08,0xE9EC, // <cjk> + 0x9D09,0xE9EB, // <cjk> + 0x9D0E,0x89A8, // <cjk> + 0x9D12,0xE9F7, // <cjk> + 0x9D15,0xE9F6, // <cjk> + 0x9D1B,0x8995, // <cjk> + 0x9D1F,0xE9F4, // <cjk> + 0x9D23,0xE9F3, // <cjk> + 0x9D26,0xE9F1, // <cjk> + 0x9D28,0x8A9B, // <cjk> + 0x9D2A,0xE9F0, // <cjk> + 0x9D2B,0x8EB0, // <cjk> + 0x9D2C,0x89A7, // <cjk> + 0x9D3B,0x8D83, // <cjk> + 0x9D3E,0xE9FA, // <cjk> + 0x9D3F,0xE9F9, // <cjk> + 0x9D41,0xE9F8, // <cjk> + 0x9D44,0xE9F5, // <cjk> + 0x9D46,0xE9FB, // <cjk> + 0x9D48,0xE9FC, // <cjk> + 0x9D50,0xEA44, // <cjk> + 0x9D51,0xEA43, // <cjk> + 0x9D59,0xEA45, // <cjk> + 0x9D5C,0x894C, // <cjk> + 0x9D5D,0xEA40, // <cjk> + 0x9D5E,0xEA41, // <cjk> + 0x9D60,0x8D94, // <cjk> + 0x9D61,0x96B7, // <cjk> + 0x9D64,0xEA42, // <cjk> + 0x9D6C,0x9651, // <cjk> + 0x9D6F,0xEA4A, // <cjk> + 0x9D72,0xEA46, // <cjk> + 0x9D7A,0xEA4B, // <cjk> + 0x9D87,0xEA48, // <cjk> + 0x9D89,0xEA47, // <cjk> + 0x9D8F,0x8C7B, // <cjk> + 0x9D9A,0xEA4C, // <cjk> + 0x9DA4,0xEA4D, // <cjk> + 0x9DA9,0xEA4E, // <cjk> + 0x9DAB,0xEA49, // <cjk> + 0x9DAF,0xE9F2, // <cjk> + 0x9DB2,0xEA4F, // <cjk> + 0x9DB4,0x92DF, // <cjk> + 0x9DB8,0xEA53, // <cjk> + 0x9DBA,0xEA54, // <cjk> + 0x9DBB,0xEA52, // <cjk> + 0x9DC1,0xEA51, // <cjk> + 0x9DC2,0xEA57, // <cjk> + 0x9DC4,0xEA50, // <cjk> + 0x9DC6,0xEA55, // <cjk> + 0x9DCF,0xEA56, // <cjk> + 0x9DD3,0xEA59, // <cjk> + 0x9DD9,0xEA58, // <cjk> + 0x9DED,0xEA5C, // <cjk> + 0x9DEF,0xEA5D, // <cjk> + 0x9DF2,0x9868, // <cjk> + 0x9DF8,0xEA5A, // <cjk> + 0x9DF9,0x91E9, // <cjk> + 0x9DFA,0x8DEB, // <cjk> + 0x9DFD,0xEA5E, // <cjk> + 0x9E1A,0xEA5F, // <cjk> + 0x9E1B,0xEA60, // <cjk> + 0x9E1E,0xEA61, // <cjk> + 0x9E75,0xEA62, // <cjk> + 0x9E78,0x8CB2, // <cjk> + 0x9E79,0xEA63, // <cjk> + 0x9E7D,0xEA64, // <cjk> + 0x9E7F,0x8EAD, // <cjk> + 0x9E81,0xEA65, // <cjk> + 0x9E88,0xEA66, // <cjk> + 0x9E8B,0xEA67, // <cjk> + 0x9E8C,0xEA68, // <cjk> + 0x9E91,0xEA6B, // <cjk> + 0x9E92,0xEA69, // <cjk> + 0x9E95,0xEA6A, // <cjk> + 0x9E97,0x97ED, // <cjk> + 0x9E9D,0xEA6C, // <cjk> + 0x9E9F,0x97D9, // <cjk> + 0x9EA5,0xEA6D, // <cjk> + 0x9EA6,0x949E, // <cjk> + 0x9EA9,0xEA6E, // <cjk> + 0x9EAA,0xEA70, // <cjk> + 0x9EAD,0xEA71, // <cjk> + 0x9EB8,0xEA6F, // <cjk> + 0x9EB9,0x8D8D, // <cjk> + 0x9EBA,0x96CB, // <cjk> + 0x9EBB,0x9683, // <cjk> + 0x9EBC,0x9BF5, // <cjk> + 0x9EBE,0x9F80, // <cjk> + 0x9EBF,0x969B, // <cjk> + 0x9EC4,0x89A9, // <cjk> + 0x9ECC,0xEA73, // <cjk> + 0x9ECD,0x8B6F, // <cjk> + 0x9ECE,0xEA74, // <cjk> + 0x9ECF,0xEA75, // <cjk> + 0x9ED0,0xEA76, // <cjk> + 0x9ED2,0x8D95, // <cjk> + 0x9ED4,0xEA77, // <cjk> + 0x9ED8,0xE0D2, // <cjk> + 0x9ED9,0x96D9, // <cjk> + 0x9EDB,0x91E1, // <cjk> + 0x9EDC,0xEA78, // <cjk> + 0x9EDD,0xEA7A, // <cjk> + 0x9EDE,0xEA79, // <cjk> + 0x9EE0,0xEA7B, // <cjk> + 0x9EE5,0xEA7C, // <cjk> + 0x9EE8,0xEA7D, // <cjk> + 0x9EEF,0xEA7E, // <cjk> + 0x9EF4,0xEA80, // <cjk> + 0x9EF6,0xEA81, // <cjk> + 0x9EF7,0xEA82, // <cjk> + 0x9EF9,0xEA83, // <cjk> + 0x9EFB,0xEA84, // <cjk> + 0x9EFC,0xEA85, // <cjk> + 0x9EFD,0xEA86, // <cjk> + 0x9F07,0xEA87, // <cjk> + 0x9F08,0xEA88, // <cjk> + 0x9F0E,0x9343, // <cjk> + 0x9F13,0x8CDB, // <cjk> + 0x9F15,0xEA8A, // <cjk> + 0x9F20,0x916C, // <cjk> + 0x9F21,0xEA8B, // <cjk> + 0x9F2C,0xEA8C, // <cjk> + 0x9F3B,0x9540, // <cjk> + 0x9F3E,0xEA8D, // <cjk> + 0x9F4A,0xEA8E, // <cjk> + 0x9F4B,0xE256, // <cjk> + 0x9F4E,0xE6D8, // <cjk> + 0x9F4F,0xE8EB, // <cjk> + 0x9F52,0xEA8F, // <cjk> + 0x9F54,0xEA90, // <cjk> + 0x9F5F,0xEA92, // <cjk> + 0x9F60,0xEA93, // <cjk> + 0x9F61,0xEA94, // <cjk> + 0x9F62,0x97EE, // <cjk> + 0x9F63,0xEA91, // <cjk> + 0x9F66,0xEA95, // <cjk> + 0x9F67,0xEA96, // <cjk> + 0x9F6A,0xEA98, // <cjk> + 0x9F6C,0xEA97, // <cjk> + 0x9F72,0xEA9A, // <cjk> + 0x9F76,0xEA9B, // <cjk> + 0x9F77,0xEA99, // <cjk> + 0x9F8D,0x97B4, // <cjk> + 0x9F95,0xEA9C, // <cjk> + 0x9F9C,0xEA9D, // <cjk> + 0x9F9D,0xE273, // <cjk> + 0x9FA0,0xEA9E, // <cjk> + 0xFF01,0x8149, // FULLWIDTH EXCLAMATION MARK + 0xFF03,0x8194, // FULLWIDTH NUMBER SIGN + 0xFF04,0x8190, // FULLWIDTH DOLLAR SIGN + 0xFF05,0x8193, // FULLWIDTH PERCENT SIGN + 0xFF06,0x8195, // FULLWIDTH AMPERSAND + 0xFF07,0x81AD, // FULLWIDTH APOSTROPHE + 0xFF08,0x8169, // FULLWIDTH LEFT PARENTHESIS + 0xFF09,0x816A, // FULLWIDTH RIGHT PARENTHESIS + 0xFF0A,0x8196, // FULLWIDTH ASTERISK + 0xFF0B,0x817B, // FULLWIDTH PLUS SIGN + 0xFF0C,0x8143, // FULLWIDTH COMMA + 0xFF0E,0x8144, // FULLWIDTH FULL STOP + 0xFF0F,0x815E, // FULLWIDTH SOLIDUS + 0xFF10,0x824F, // FULLWIDTH DIGIT ZERO + 0xFF11,0x8250, // FULLWIDTH DIGIT ONE + 0xFF12,0x8251, // FULLWIDTH DIGIT TWO + 0xFF13,0x8252, // FULLWIDTH DIGIT THREE + 0xFF14,0x8253, // FULLWIDTH DIGIT FOUR + 0xFF15,0x8254, // FULLWIDTH DIGIT FIVE + 0xFF16,0x8255, // FULLWIDTH DIGIT SIX + 0xFF17,0x8256, // FULLWIDTH DIGIT SEVEN + 0xFF18,0x8257, // FULLWIDTH DIGIT EIGHT + 0xFF19,0x8258, // FULLWIDTH DIGIT NINE + 0xFF1A,0x8146, // FULLWIDTH COLON + 0xFF1B,0x8147, // FULLWIDTH SEMICOLON + 0xFF1C,0x8183, // FULLWIDTH LESS-THAN SIGN + 0xFF1D,0x8181, // FULLWIDTH EQUALS SIGN + 0xFF1E,0x8184, // FULLWIDTH GREATER-THAN SIGN + 0xFF1F,0x8148, // FULLWIDTH QUESTION MARK + 0xFF20,0x8197, // FULLWIDTH COMMERCIAL AT + 0xFF21,0x8260, // FULLWIDTH LATIN CAPITAL LETTER A + 0xFF22,0x8261, // FULLWIDTH LATIN CAPITAL LETTER B + 0xFF23,0x8262, // FULLWIDTH LATIN CAPITAL LETTER C + 0xFF24,0x8263, // FULLWIDTH LATIN CAPITAL LETTER D + 0xFF25,0x8264, // FULLWIDTH LATIN CAPITAL LETTER E + 0xFF26,0x8265, // FULLWIDTH LATIN CAPITAL LETTER F + 0xFF27,0x8266, // FULLWIDTH LATIN CAPITAL LETTER G + 0xFF28,0x8267, // FULLWIDTH LATIN CAPITAL LETTER H + 0xFF29,0x8268, // FULLWIDTH LATIN CAPITAL LETTER I + 0xFF2A,0x8269, // FULLWIDTH LATIN CAPITAL LETTER J + 0xFF2B,0x826A, // FULLWIDTH LATIN CAPITAL LETTER K + 0xFF2C,0x826B, // FULLWIDTH LATIN CAPITAL LETTER L + 0xFF2D,0x826C, // FULLWIDTH LATIN CAPITAL LETTER M + 0xFF2E,0x826D, // FULLWIDTH LATIN CAPITAL LETTER N + 0xFF2F,0x826E, // FULLWIDTH LATIN CAPITAL LETTER O + 0xFF30,0x826F, // FULLWIDTH LATIN CAPITAL LETTER P + 0xFF31,0x8270, // FULLWIDTH LATIN CAPITAL LETTER Q + 0xFF32,0x8271, // FULLWIDTH LATIN CAPITAL LETTER R + 0xFF33,0x8272, // FULLWIDTH LATIN CAPITAL LETTER S + 0xFF34,0x8273, // FULLWIDTH LATIN CAPITAL LETTER T + 0xFF35,0x8274, // FULLWIDTH LATIN CAPITAL LETTER U + 0xFF36,0x8275, // FULLWIDTH LATIN CAPITAL LETTER V + 0xFF37,0x8276, // FULLWIDTH LATIN CAPITAL LETTER W + 0xFF38,0x8277, // FULLWIDTH LATIN CAPITAL LETTER X + 0xFF39,0x8278, // FULLWIDTH LATIN CAPITAL LETTER Y + 0xFF3A,0x8279, // FULLWIDTH LATIN CAPITAL LETTER Z + 0xFF3B,0x816D, // FULLWIDTH LEFT SQUARE BRACKET + 0xFF3D,0x816E, // FULLWIDTH RIGHT SQUARE BRACKET + 0xFF3E,0x814F, // FULLWIDTH CIRCUMFLEX ACCENT + 0xFF3F,0x8151, // FULLWIDTH LOW LINE + 0xFF40,0x814D, // FULLWIDTH GRAVE ACCENT + 0xFF41,0x8281, // FULLWIDTH LATIN SMALL LETTER A + 0xFF42,0x8282, // FULLWIDTH LATIN SMALL LETTER B + 0xFF43,0x8283, // FULLWIDTH LATIN SMALL LETTER C + 0xFF44,0x8284, // FULLWIDTH LATIN SMALL LETTER D + 0xFF45,0x8285, // FULLWIDTH LATIN SMALL LETTER E + 0xFF46,0x8286, // FULLWIDTH LATIN SMALL LETTER F + 0xFF47,0x8287, // FULLWIDTH LATIN SMALL LETTER G + 0xFF48,0x8288, // FULLWIDTH LATIN SMALL LETTER H + 0xFF49,0x8289, // FULLWIDTH LATIN SMALL LETTER I + 0xFF4A,0x828A, // FULLWIDTH LATIN SMALL LETTER J + 0xFF4B,0x828B, // FULLWIDTH LATIN SMALL LETTER K + 0xFF4C,0x828C, // FULLWIDTH LATIN SMALL LETTER L + 0xFF4D,0x828D, // FULLWIDTH LATIN SMALL LETTER M + 0xFF4E,0x828E, // FULLWIDTH LATIN SMALL LETTER N + 0xFF4F,0x828F, // FULLWIDTH LATIN SMALL LETTER O + 0xFF50,0x8290, // FULLWIDTH LATIN SMALL LETTER P + 0xFF51,0x8291, // FULLWIDTH LATIN SMALL LETTER Q + 0xFF52,0x8292, // FULLWIDTH LATIN SMALL LETTER R + 0xFF53,0x8293, // FULLWIDTH LATIN SMALL LETTER S + 0xFF54,0x8294, // FULLWIDTH LATIN SMALL LETTER T + 0xFF55,0x8295, // FULLWIDTH LATIN SMALL LETTER U + 0xFF56,0x8296, // FULLWIDTH LATIN SMALL LETTER V + 0xFF57,0x8297, // FULLWIDTH LATIN SMALL LETTER W + 0xFF58,0x8298, // FULLWIDTH LATIN SMALL LETTER X + 0xFF59,0x8299, // FULLWIDTH LATIN SMALL LETTER Y + 0xFF5A,0x829A, // FULLWIDTH LATIN SMALL LETTER Z + 0xFF5B,0x816F, // FULLWIDTH LEFT CURLY BRACKET + 0xFF5C,0x8162, // FULLWIDTH VERTICAL LINE + 0xFF5D,0x8170, // FULLWIDTH RIGHT CURLY BRACKET + 0xFFE3,0x8150, // FULLWIDTH MACRON + 0xFFE5,0x818F // FULLWIDTH YEN SIGN +};
\ No newline at end of file diff --git a/backend/upcean.c b/backend/upcean.c new file mode 100644 index 0000000..c99091b --- /dev/null +++ b/backend/upcean.c @@ -0,0 +1,808 @@ +/* upcean.c - Handles UPC, EAN and ISBN + + libzint - the open source barcode library + Copyright (C) 2008 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#define SODIUM "0123456789+" +#define EAN2 102 +#define EAN5 105 + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "common.h" + +/* UPC and EAN tables checked against EN 797:1996 */ + +static const char *UPCParity0[10] = {"BBBAAA", "BBABAA", "BBAABA", "BBAAAB", "BABBAA", "BAABBA", "BAAABB", + "BABABA", "BABAAB", "BAABAB"}; /* Number set for UPC-E symbol (EN Table 4) */ +static const char *UPCParity1[10] = {"AAABBB", "AABABB", "AABBAB", "AABBBA", "ABAABB", "ABBAAB", "ABBBAA", + "ABABAB", "ABABBA", "ABBABA"}; /* Not covered by BS EN 797:1995 */ +static const char *EAN2Parity[4] = {"AA", "AB", "BA", "BB"}; /* Number sets for 2-digit add-on (EN Table 6) */ +static const char *EAN5Parity[10] = {"BBAAA", "BABAA", "BAABA", "BAAAB", "ABBAA", "AABBA", "AAABB", "ABABA", + "ABAAB", "AABAB"}; /* Number set for 5-digit add-on (EN Table 7) */ +static const char *EAN13Parity[10] = {"AAAAA", "ABABB", "ABBAB", "ABBBA", "BAABB", "BBAAB", "BBBAA", "BABAB", + "BABBA", "BBABA"}; /* Left hand of the EAN-13 symbol (EN Table 3) */ +static const char *EANsetA[10] = {"3211", "2221", "2122", "1411", "1132", "1231", "1114", "1312", "1213", + "3112"}; /* Representation set A and C (EN Table 1) */ +static const char *EANsetB[10] = {"1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121", + "2113"}; /* Representation set B (EN Table 1) */ + +char upc_check(char source[]) +{ /* Calculate the correct check digit for a UPC barcode */ + unsigned int i, count, check_digit; + + count = 0; + + for (i = 0; i < strlen(source); i++) { + count += ctoi(source[i]); + + if (!(i & 1)) { + count += 2 * (ctoi(source[i])); + } + } + + check_digit = 10 - (count%10); + if (check_digit == 10) { check_digit = 0; } + return itoc(check_digit); +} + +void upca_draw(char source[], char dest[]) +{ /* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */ + unsigned int i, half_way; + + half_way = strlen(source) / 2; + + /* start character */ + concat (dest, "111"); + + for(i = 0; i <= strlen(source); i++) + { + if (i == half_way) + { + /* middle character - separates manufacturer no. from product no. */ + /* also inverts right hand characters */ + concat(dest, "11111"); + } + + lookup(NEON, EANsetA, source[i], dest); + } + + /* stop character */ + concat (dest, "111"); +} + +void upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) +{ /* Make a UPC A barcode when we haven't been given the check digit */ + int length; + char gtin[15]; + + strcpy(gtin, (char*)source); + length = strlen(gtin); + gtin[length] = upc_check(gtin); + gtin[length + 1] = '\0'; + upca_draw(gtin, dest); + ustrcpy(symbol->text, (unsigned char*)gtin); +} + +void upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) +{ /* UPC E is a zero-compressed version of UPC A */ + unsigned int i, num_system; + char emode, equivalent[12], check_digit, parity[8], temp[8]; + char hrt[9]; + + /* Two number systems can be used - system 0 and system 1 */ + if(ustrlen(source) == 7) { + switch(source[0]) { + case '0': num_system = 0; break; + case '1': num_system = 1; break; + default: num_system = 0; source[0] = '0'; break; + } + strcpy(temp, (char*)source); + strcpy(hrt, (char*)source); + for(i = 1; i <= 7; i++) { + source[i - 1] = temp[i]; + } + } + else { + num_system = 0; + hrt[0] = '0'; + hrt[1] = '\0'; + concat(hrt, (char*)source); + } + + /* Expand the zero-compressed UPCE code to make a UPCA equivalent (EN Table 5) */ + emode = source[5]; + for(i = 0; i < 11; i++) { + equivalent[i] = '0'; + } + if(num_system == 1) { equivalent[0] = temp[0]; } + equivalent[1] = source[0]; + equivalent[2] = source[1]; + equivalent[11] = '\0'; + + switch(emode) + { + case '0': + case '1': + case '2': + equivalent[3] = emode; + equivalent[8] = source[2]; + equivalent[9] = source[3]; + equivalent[10] = source[4]; + break; + case '3': + equivalent[3] = source[2]; + equivalent[9] = source[3]; + equivalent[10] = source[4]; + if(((source[2] == '0') || (source[2] == '1')) || (source[2] == '2')) { + /* Note 1 - "X3 shall not be equal to 0, 1 or 2" */ + strcpy(symbol->errtxt, "Invalid UPC-E data"); + } + break; + case '4': + equivalent[3] = source[2]; + equivalent[4] = source[3]; + equivalent[10] = source[4]; + if(source[3] == '0') { + /* Note 2 - "X4 shall not be equal to 0" */ + strcpy(symbol->errtxt, "Invalid UPC-E data"); + } + break; + case '5': + case '6': + case '7': + case '8': + case '9': + equivalent[3] = source[2]; + equivalent[4] = source[3]; + equivalent[5] = source[4]; + equivalent[10] = emode; + if(source[4] == '0') { + /* Note 3 - "X5 shall not be equal to 0" */ + strcpy(symbol->errtxt, "Invalid UPC-E data"); + } + break; + } + + /* Get the check digit from the expanded UPCA code */ + + check_digit = upc_check(equivalent); + + /* Use the number system and check digit information to choose a parity scheme */ + if(num_system == 1) { + strcpy(parity, UPCParity1[ctoi(check_digit)]); + } else { + strcpy(parity, UPCParity0[ctoi(check_digit)]); + } + + /* Take all this information and make the barcode pattern */ + + /* start character */ + concat (dest, "111"); + + for(i = 0; i <= ustrlen(source); i++) { + switch(parity[i]) { + case 'A': lookup(NEON, EANsetA, source[i], dest); break; + case 'B': lookup(NEON, EANsetB, source[i], dest); break; + } + } + + /* stop character */ + concat (dest, "111111"); + + hrt[7] = check_digit; + hrt[8] = '\0'; + ustrcpy(symbol->text, (unsigned char*)hrt); +} + + +void add_on(unsigned char source[], char dest[], int mode) +{ /* EAN-2 and EAN-5 add-on codes */ + char parity[6]; + unsigned int i, code_type; + + /* If an add-on then append with space */ + if (mode != 0) + { + concat(dest, "9"); + } + + /* Start character */ + concat (dest, "112"); + + /* Determine EAN2 or EAN5 add-on */ + if(ustrlen(source) == 2) + { + code_type = EAN2; + } + else + { + code_type = EAN5; + } + + /* Calculate parity for EAN2 */ + if(code_type == EAN2) + { + int code_value, parity_bit; + + code_value = (10 * ctoi(source[0])) + ctoi(source[1]); + parity_bit = code_value%4; + strcpy(parity, EAN2Parity[parity_bit]); + } + + if(code_type == EAN5) + { + int values[6], parity_sum, parity_bit; + + for(i = 0; i < 6; i++) + { + values[i] = ctoi(source[i]); + } + + parity_sum = (3 * (values[0] + values[2] + values[4])); + parity_sum += (9 * (values[1] + values[3])); + + parity_bit = parity_sum%10; + strcpy(parity, EAN5Parity[parity_bit]); + } + + for(i = 0; i < ustrlen(source); i++) + { + switch(parity[i]) { + case 'A': lookup(NEON, EANsetA, source[i], dest); break; + case 'B': lookup(NEON, EANsetB, source[i], dest); break; + } + + /* Glyph separator */ + if(i != (ustrlen(source) - 1)) + { + concat (dest, "11"); + } + } +} + + +/* ************************ EAN-13 ****************** */ + +char ean_check(char source[]) +{ /* Calculate the correct check digit for a EAN-13 barcode */ + int i; + unsigned int h, count, check_digit; + + count = 0; + + h = strlen(source); + for (i = h - 1; i >= 0; i--) { + count += ctoi(source[i]); + + if (i & 1) { + count += 2 * ctoi(source[i]); + } + } + check_digit = 10 - (count%10); + if (check_digit == 10) { check_digit = 0; } + return itoc(check_digit); +} + +void ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) +{ + unsigned int length, i, half_way; + char parity[6]; + char gtin[15]; + + strcpy(parity, ""); + strcpy(gtin, (char*)source); + + /* Add the appropriate check digit */ + length = strlen(gtin); + gtin[length] = ean_check(gtin); + gtin[length + 1] = '\0'; + + /* Get parity for first half of the symbol */ + lookup(SODIUM, EAN13Parity, gtin[0], parity); + + /* Now get on with the cipher */ + half_way = 7; + + /* start character */ + concat (dest, "111"); + length = strlen(gtin); + for(i = 1; i <= length; i++) + { + if (i == half_way) + { + /* middle character - separates manufacturer no. from product no. */ + /* also inverses right hand characters */ + concat (dest, "11111"); + } + + if(((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) + { + lookup(NEON, EANsetB, gtin[i], dest); + } + else + { + lookup(NEON, EANsetA, gtin[i], dest); + } + } + + /* stop character */ + concat (dest, "111"); + + ustrcpy(symbol->text, (unsigned char*)gtin); +} + +void ean8(struct zint_symbol *symbol, unsigned char source[], char dest[]) +{ /* Make an EAN-8 barcode when we haven't been given the check digit */ + /* EAN-8 is basically the same as UPC-A but with fewer digits */ + int length; + char gtin[10]; + + strcpy(gtin, (char*)source); + length = strlen(gtin); + gtin[length] = upc_check(gtin); + gtin[length + 1] = '\0'; + upca_draw(gtin, dest); + ustrcpy(symbol->text, (unsigned char*)gtin); +} + +char isbn13_check(unsigned char source[]) /* For ISBN(13) only */ +{ + unsigned int i, weight, sum, check, h; + + sum = 0; + weight = 1; + h = ustrlen(source) - 1; + + for(i = 0; i < h; i++) + { + sum += ctoi(source[i]) * weight; + if(weight == 1) weight = 3; else weight = 1; + } + + check = sum % 10; + check = 10 - check; + if(check == 10) check = 0; + return itoc(check); +} + +char isbn_check(unsigned char source[]) /* For ISBN(10) and SBN only */ +{ + unsigned int i, weight, sum, check, h; + char check_char; + + sum = 0; + weight = 1; + h = ustrlen(source) - 1; + + for(i = 0; i < h; i++) + { + sum += ctoi(source[i]) * weight; + weight++; + } + + check = sum % 11; + check_char = itoc(check); + if(check == 10) { check_char = 'X'; } + return check_char; +} + +int isbn(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char dest[]) /* Make an EAN-13 barcode from an SBN or ISBN */ +{ + int i, error_number; + char check_digit; + + to_upper(source); + error_number = is_sane("0123456789X", source, src_len); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in input"); + return error_number; + } + + /* Input must be 9, 10 or 13 characters */ + if(((src_len < 9) || (src_len > 13)) || ((src_len > 10) && (src_len < 13))) + { + strcpy(symbol->errtxt, "Input wrong length"); + return ERROR_TOO_LONG; + } + + if(src_len == 13) /* Using 13 character ISBN */ + { + if(!(((source[0] == '9') && (source[1] == '7')) && + ((source[2] == '8') || (source[2] == '9')))) + { + strcpy(symbol->errtxt, "Invalid ISBN"); + return ERROR_INVALID_DATA; + } + + check_digit = isbn13_check(source); + if (source[src_len - 1] != check_digit) + { + strcpy(symbol->errtxt, "Incorrect ISBN check"); + return ERROR_INVALID_CHECK; + } + source[12] = '\0'; + + ean13(symbol, source, dest); + } + + if(src_len == 10) /* Using 10 digit ISBN */ + { + check_digit = isbn_check(source); + if(check_digit != source[src_len - 1]) + { + strcpy(symbol->errtxt, "Incorrect ISBN check"); + return ERROR_INVALID_CHECK; + } + for(i = 13; i > 0; i--) + { + source[i] = source[i - 3]; + } + source[0] = '9'; + source[1] = '7'; + source[2] = '8'; + source[12] = '\0'; + + ean13(symbol, source, dest); + } + + if(src_len == 9) /* Using 9 digit SBN */ + { + /* Add leading zero */ + for(i = 10; i > 0; i--) + { + source[i] = source[i - 1]; + } + source[0] = '0'; + + /* Verify check digit */ + check_digit = isbn_check(source); + if(check_digit != source[ustrlen(source) - 1]) + { + strcpy(symbol->errtxt, "Incorrect SBN check"); + return ERROR_INVALID_CHECK; + } + + /* Convert to EAN-13 number */ + for(i = 13; i > 0; i--) + { + source[i] = source[i - 3]; + } + source[0] = '9'; + source[1] = '7'; + source[2] = '8'; + source[12] = '\0'; + + ean13(symbol, source, dest); + } + + return 0; +} + +void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) { + /* Add leading zeroes to EAN and UPC strings */ + unsigned char first_part[20], second_part[20], zfirst_part[20], zsecond_part[20]; + int with_addon = 0; + int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h; + + h = ustrlen(source); + for(i = 0; i < h; i++) { + if(source[i] == '+') { + with_addon = 1; + } else { + if(with_addon == 0) { + first_len++; + } else { + second_len++; + } + } + } + + ustrcpy(first_part, (unsigned char *)""); + ustrcpy(second_part, (unsigned char *)""); + ustrcpy(zfirst_part, (unsigned char *)""); + ustrcpy(zsecond_part, (unsigned char *)""); + + /* Split input into two strings */ + for(i = 0; i < first_len; i++) { + first_part[i] = source[i]; + first_part[i + 1] = '\0'; + } + + for(i = 0; i < second_len; i++) { + second_part[i] = source[i + first_len + 1]; + second_part[i + 1] = '\0'; + } + + /* Calculate target lengths */ + if(second_len <= 5) { zsecond_len = 5; } + if(second_len <= 2) { zsecond_len = 2; } + if(second_len == 0) { zsecond_len = 0; } + switch(symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CC: + if(first_len <= 12) { zfirst_len = 12; } + if(first_len <= 7) { zfirst_len = 7; } + if(second_len == 0) { + if(first_len <= 5) { zfirst_len = 5; } + if(first_len <= 2) { zfirst_len = 2; } + } + break; + case BARCODE_UPCA: + case BARCODE_UPCA_CC: + zfirst_len = 11; + break; + case BARCODE_UPCE: + case BARCODE_UPCE_CC: + if(first_len == 7) { zfirst_len = 7; } + if(first_len <= 6) { zfirst_len = 6; } + break; + case BARCODE_ISBNX: + if(first_len <= 9) { zfirst_len = 9; } + break; + } + + + /* Add leading zeroes */ + for(i = 0; i < (zfirst_len - first_len); i++) { + uconcat(zfirst_part, (unsigned char *)"0"); + } + uconcat(zfirst_part, first_part); + for(i = 0; i < (zsecond_len - second_len); i++) { + uconcat(zsecond_part, (unsigned char *)"0"); + } + uconcat(zsecond_part, second_part); + + /* Copy adjusted data back to local_source */ + uconcat(local_source, zfirst_part); + if(zsecond_len != 0) { + uconcat(local_source, (unsigned char *)"+"); + uconcat(local_source, zsecond_part); + } +} + +int eanx(struct zint_symbol *symbol, unsigned char source[], int src_len) +{ + /* splits string to parts before and after '+' parts */ + unsigned char first_part[20] = { 0 }, second_part[20] = { 0 }, dest[1000] = { 0 }; + unsigned char local_source[20] = { 0 }; + unsigned int latch, reader, writer, with_addon; + int error_number, i; + + + with_addon = FALSE; + latch = FALSE; + writer = 0; + + if(src_len > 19) { + strcpy(symbol->errtxt, "Input too long"); + return ERROR_TOO_LONG; + } + if(symbol->symbology != BARCODE_ISBNX) { + /* ISBN has it's own checking routine */ + error_number = is_sane("0123456789+", source, src_len); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + } else { + error_number = is_sane("0123456789Xx", source, src_len); + if(error_number == ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in input"); + return error_number; + } + } + + + /* Add leading zeroes */ + ustrcpy(local_source, (unsigned char *)""); + if(symbol->symbology == BARCODE_ISBNX) { + to_upper(local_source); + } + + ean_leading_zeroes(symbol, source, local_source); + + for(reader = 0; reader <= ustrlen(local_source); reader++) + { + if(source[reader] == '+') { with_addon = TRUE; } + } + + reader = 0; + if(with_addon) { + do { + if(local_source[reader] == '+') { + first_part[writer] = '\0'; + latch = TRUE; + reader++; + writer = 0; + } + + if(latch) { + second_part[writer] = local_source[reader]; + reader++; + writer++; + } else { + first_part[writer] = local_source[reader]; + reader++; + writer++; + } + } while (reader <= ustrlen(local_source)); + } else { + strcpy((char*)first_part, (char*)local_source); + } + + + switch(symbol->symbology) + { + case BARCODE_EANX: + switch(ustrlen(first_part)) + { + case 2: add_on(first_part, (char*)dest, 0); ustrcpy(symbol->text, first_part); break; + case 5: add_on(first_part, (char*)dest, 0); ustrcpy(symbol->text, first_part); break; + case 7: ean8(symbol, first_part, (char*)dest); break; + case 12: ean13(symbol, first_part, (char*)dest); break; + default: strcpy(symbol->errtxt, "Invalid length input"); return ERROR_TOO_LONG; break; + } + break; + case BARCODE_EANX_CC: + switch(ustrlen(first_part)) + { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */ + case 7: set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 67); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 68); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 1, 67); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + ean8(symbol, first_part, (char*)dest); break; + case 12:set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 95); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 96); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 2, 95); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + ean13(symbol, first_part, (char*)dest); break; + default: strcpy(symbol->errtxt, "Invalid length EAN input"); return ERROR_TOO_LONG; break; + } + break; + case BARCODE_UPCA: + if(ustrlen(first_part) == 11) { + upca(symbol, first_part, (char*)dest); + } else { + strcpy(symbol->errtxt, "Input wrong length"); + return ERROR_TOO_LONG; + } + break; + case BARCODE_UPCA_CC: + if(ustrlen(first_part) == 11) { + set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 95); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 96); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 2, 95); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + upca(symbol, first_part, (char*)dest); + } else { + strcpy(symbol->errtxt, "UPCA input wrong length"); + return ERROR_TOO_LONG; + } + break; + case BARCODE_UPCE: + if((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 7)) { + upce(symbol, first_part, (char*)dest); + } else { + strcpy(symbol->errtxt, "Input wrong length"); + return ERROR_TOO_LONG; + } + break; + case BARCODE_UPCE_CC: + if((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 7)) { + set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 51); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 52); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 2, 51); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + upce(symbol, first_part, (char*)dest); + } else { + strcpy(symbol->errtxt, "UPCE input wrong length"); + return ERROR_TOO_LONG; + } + break; + case BARCODE_ISBNX: + error_number = isbn(symbol, first_part, ustrlen(first_part), (char*)dest); + if(error_number > 4) { + return error_number; + } + break; + } + switch(ustrlen(second_part)) + { + case 0: break; + case 2: + add_on(second_part, (char*)dest, 1); + uconcat(symbol->text, (unsigned char*)"+"); + uconcat(symbol->text, second_part); + break; + case 5: + add_on(second_part, (char*)dest, 1); + uconcat(symbol->text, (unsigned char*)"+"); + uconcat(symbol->text, second_part); + break; + default: + strcpy(symbol->errtxt, "Invalid length input"); + return ERROR_TOO_LONG; + break; + } + + expand(symbol, (char*)dest); + + switch(symbol->symbology) { + case BARCODE_EANX_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + /* shift the symbol to the right one space to allow for separator bars */ + for(i = (symbol->width + 1); i >= 1; i--) { + if(module_is_set(symbol, symbol->rows - 1, i - 1)) { + set_module(symbol, symbol->rows - 1, i); + } else { + unset_module(symbol, symbol->rows - 1, i); + } + } + unset_module(symbol, symbol->rows - 1, 0); + symbol->width += 2; + break; + } + + + if((symbol->errtxt[0] == 'w') && (error_number == 0)) { + error_number = 1; /* flag UPC-E warnings */ + } + return error_number; +} + + + + diff --git a/backend/zint.def b/backend/zint.def new file mode 100644 index 0000000..262390f --- /dev/null +++ b/backend/zint.def @@ -0,0 +1,27 @@ +;------------------------------------------ +; LIBZINT module definition file for Windows +;------------------------------------------ + +LIBRARY + +EXPORTS +;Version 2.4.3 +DllGetVersion + +ZBarcode_Create +ZBarcode_Clear +ZBarcode_Delete + +ZBarcode_Encode +ZBarcode_Encode_File +ZBarcode_Print +ZBarcode_Encode_and_Print +ZBarcode_Encode_File_and_Print + +ZBarcode_Render + +ZBarcode_Buffer +ZBarcode_Encode_and_Buffer +ZBarcode_Encode_File_and_Buffer + +ZBarcode_ValidID
\ No newline at end of file diff --git a/backend/zint.h b/backend/zint.h new file mode 100644 index 0000000..1efb96e --- /dev/null +++ b/backend/zint.h @@ -0,0 +1,257 @@ +/* zint.h - definitions for libzint + + libzint - the open source barcode library + Copyright (C) 2009 Robin Stuart <robin@zint.org.uk> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#ifndef ZINT_H +#define ZINT_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include <stdio.h> + +struct zint_render_line { + float x, y, length, width; + struct zint_render_line *next; /* Pointer to next line */ +}; + +struct zint_render_string { + float x, y, fsize; + float width; /* Suggested string width, may be 0 if none recommended */ + int length; + unsigned char *text; + struct zint_render_string *next; /* Pointer to next character */ +}; + +struct zint_render_ring { + float x, y, radius, line_width; + struct zint_render_ring *next; /* Pointer to next ring */ +}; + +struct zint_render_hexagon { + float x, y; + struct zint_render_hexagon *next; /* Pointer to next hexagon */ +}; + +struct zint_render { + float width, height; + struct zint_render_line *lines; /* Pointer to first line */ + struct zint_render_string *strings; /* Pointer to first string */ + struct zint_render_ring *rings; /* Pointer to first ring */ + struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */ +}; + +struct zint_symbol { + int symbology; + int height; + int whitespace_width; + int border_width; + int output_options; +#define ZINT_COLOUR_SIZE 10 + char fgcolour[ZINT_COLOUR_SIZE]; + char bgcolour[ZINT_COLOUR_SIZE]; + char outfile[FILENAME_MAX]; + float scale; + int option_1; + int option_2; + int option_3; + int show_hrt; + int input_mode; +#define ZINT_TEXT_SIZE 128 + unsigned char text[ZINT_TEXT_SIZE]; + int rows; + int width; +#define ZINT_PRIMARY_SIZE 128 + char primary[ZINT_PRIMARY_SIZE]; +#define ZINT_ROWS_MAX 178 +#define ZINT_COLS_MAX 178 + unsigned char encoded_data[ZINT_ROWS_MAX][ZINT_COLS_MAX]; + int row_height[ZINT_ROWS_MAX]; /* Largest symbol is 177x177 QR Code */ +#define ZINT_ERR_SIZE 100 + char errtxt[ZINT_ERR_SIZE]; + char *bitmap; + int bitmap_width; + int bitmap_height; + struct zint_render *rendered; +}; + + +/* Tbarcode 7 codes */ +#define BARCODE_CODE11 1 +#define BARCODE_C25MATRIX 2 +#define BARCODE_C25INTER 3 +#define BARCODE_C25IATA 4 +#define BARCODE_C25LOGIC 6 +#define BARCODE_C25IND 7 +#define BARCODE_CODE39 8 +#define BARCODE_EXCODE39 9 +#define BARCODE_EANX 13 +#define BARCODE_EAN128 16 +#define BARCODE_CODABAR 18 +#define BARCODE_CODE128 20 +#define BARCODE_DPLEIT 21 +#define BARCODE_DPIDENT 22 +#define BARCODE_CODE16K 23 +#define BARCODE_CODE49 24 +#define BARCODE_CODE93 25 +#define BARCODE_FLAT 28 +#define BARCODE_RSS14 29 +#define BARCODE_RSS_LTD 30 +#define BARCODE_RSS_EXP 31 +#define BARCODE_TELEPEN 32 +#define BARCODE_UPCA 34 +#define BARCODE_UPCE 37 +#define BARCODE_POSTNET 40 +#define BARCODE_MSI_PLESSEY 47 +#define BARCODE_FIM 49 +#define BARCODE_LOGMARS 50 +#define BARCODE_PHARMA 51 +#define BARCODE_PZN 52 +#define BARCODE_PHARMA_TWO 53 +#define BARCODE_PDF417 55 +#define BARCODE_PDF417TRUNC 56 +#define BARCODE_MAXICODE 57 +#define BARCODE_QRCODE 58 +#define BARCODE_CODE128B 60 +#define BARCODE_AUSPOST 63 +#define BARCODE_AUSREPLY 66 +#define BARCODE_AUSROUTE 67 +#define BARCODE_AUSREDIRECT 68 +#define BARCODE_ISBNX 69 +#define BARCODE_RM4SCC 70 +#define BARCODE_DATAMATRIX 71 +#define BARCODE_EAN14 72 +#define BARCODE_CODABLOCKF 74 +#define BARCODE_NVE18 75 +#define BARCODE_JAPANPOST 76 +#define BARCODE_KOREAPOST 77 +#define BARCODE_RSS14STACK 79 +#define BARCODE_RSS14STACK_OMNI 80 +#define BARCODE_RSS_EXPSTACK 81 +#define BARCODE_PLANET 82 +#define BARCODE_MICROPDF417 84 +#define BARCODE_ONECODE 85 +#define BARCODE_PLESSEY 86 + +/* Tbarcode 8 codes */ +#define BARCODE_TELEPEN_NUM 87 +#define BARCODE_ITF14 89 +#define BARCODE_KIX 90 +#define BARCODE_AZTEC 92 +#define BARCODE_DAFT 93 +#define BARCODE_MICROQR 97 + +/* Tbarcode 9 codes */ +#define BARCODE_HIBC_128 98 +#define BARCODE_HIBC_39 99 +#define BARCODE_HIBC_DM 102 +#define BARCODE_HIBC_QR 104 +#define BARCODE_HIBC_PDF 106 +#define BARCODE_HIBC_MICPDF 108 +#define BARCODE_HIBC_BLOCKF 110 +#define BARCODE_HIBC_AZTEC 112 + +/* Zint specific */ +#define BARCODE_AZRUNE 128 +#define BARCODE_CODE32 129 +#define BARCODE_EANX_CC 130 +#define BARCODE_EAN128_CC 131 +#define BARCODE_RSS14_CC 132 +#define BARCODE_RSS_LTD_CC 133 +#define BARCODE_RSS_EXP_CC 134 +#define BARCODE_UPCA_CC 135 +#define BARCODE_UPCE_CC 136 +#define BARCODE_RSS14STACK_CC 137 +#define BARCODE_RSS14_OMNI_CC 138 +#define BARCODE_RSS_EXPSTACK_CC 139 +#define BARCODE_CHANNEL 140 +#define BARCODE_CODEONE 141 +#define BARCODE_GRIDMATRIX 142 + +#define BARCODE_NO_ASCII 1 +#define BARCODE_BIND 2 +#define BARCODE_BOX 4 +#define BARCODE_STDOUT 8 +#define READER_INIT 16 +#define SMALL_TEXT 32 + +#define DATA_MODE 0 +#define UNICODE_MODE 1 +#define GS1_MODE 2 +#define KANJI_MODE 3 +#define SJIS_MODE 4 + +#define DM_SQUARE 100 + +#define WARN_INVALID_OPTION 2 +#define ERROR_TOO_LONG 5 +#define ERROR_INVALID_DATA 6 +#define ERROR_INVALID_CHECK 7 +#define ERROR_INVALID_OPTION 8 +#define ERROR_ENCODING_PROBLEM 9 +#define ERROR_FILE_ACCESS 10 +#define ERROR_MEMORY 11 + +#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER) +# if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL) +# define ZINT_EXTERN __declspec(dllexport) +# elif defined(ZINT_DLL) +# define ZINT_EXTERN __declspec(dllimport) +# else +# define ZINT_EXTERN extern +# endif +#else +# define ZINT_EXTERN extern +#endif + +ZINT_EXTERN struct zint_symbol* ZBarcode_Create(void); +ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol); +ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol); + +ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input, int length); +ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename); +ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle); +ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); +ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle); + +ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, float width, float height); + +ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle); +ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); +ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle); + +ZINT_EXTERN int ZBarcode_ValidID(int symbol_id); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* ZINT_H */ diff --git a/cmake/modules/FindZint.cmake b/cmake/modules/FindZint.cmake new file mode 100644 index 0000000..e89c236 --- /dev/null +++ b/cmake/modules/FindZint.cmake @@ -0,0 +1,51 @@ +# - Find Zint and QZint +# Find the native Zint and QZint includes and library +# +# ZINT_INCLUDE_DIR - where to find zint.h, etc. +# ZINT_LIBRARIES - List of libraries when using zint. +# ZINT_FOUND - True if zint found. +# QZINT_INCLUDE_DIR - where to find qzint.h, etc. +# QZINT_LIBRARIES - List of libraries when using qzint. +# QZINT_FOUND - True if qzint found. + +################### FIND ZINT ###################### + +IF (ZINT_INCLUDE_DIR) + # Already in cache, be silent + SET(ZINT_FIND_QUIETLY TRUE) +ENDIF (ZINT_INCLUDE_DIR) + +FIND_PATH(ZINT_INCLUDE_DIR zint.h) + +FIND_LIBRARY(ZINT_LIBRARY NAMES zint ) + +# handle the QUIETLY and REQUIRED arguments and set ZINT_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Zint DEFAULT_MSG ZINT_LIBRARY ZINT_INCLUDE_DIR) + +IF(ZINT_FOUND) + SET( ZINT_LIBRARIES ${ZINT_LIBRARY} ) +ELSE(ZINT_FOUND) + SET( ZINT_LIBRARIES ) +ENDIF(ZINT_FOUND) + +MARK_AS_ADVANCED( ZINT_LIBRARY ZINT_INCLUDE_DIR ) + +FIND_PATH(QZINT_INCLUDE_DIR qzint.h) + +FIND_LIBRARY(QZINT_LIBRARY NAMES QZint ) + +# handle the QUIETLY and REQUIRED arguments and set QZINT_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(QZint DEFAULT_MSG QZINT_LIBRARY QZINT_INCLUDE_DIR) + +IF(QZINT_FOUND) + SET( QZINT_LIBRARIES ${QZINT_LIBRARY} ) +ELSE(QZINT_FOUND) + SET( QZINT_LIBRARIES ) +ENDIF(QZINT_FOUND) + +MARK_AS_ADVANCED( QZINT_LIBRARY QZINT_INCLUDE_DIR ) + diff --git a/cmake_uninstall.cmake.in b/cmake_uninstall.cmake.in new file mode 100644 index 0000000..87e6b06 --- /dev/null +++ b/cmake_uninstall.cmake.in @@ -0,0 +1,21 @@ +IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +STRING(REGEX REPLACE "\n" ";" files "${files}") +FOREACH(file ${files}) + MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") +# IF(EXISTS "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) +# ELSE(EXISTS "$ENV{DESTDIR}${file}") +# MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") +# ENDIF(EXISTS "$ENV{DESTDIR}${file}") +ENDFOREACH(file) diff --git a/packaging/zint.spec b/packaging/zint.spec new file mode 100644 index 0000000..d29174d --- /dev/null +++ b/packaging/zint.spec @@ -0,0 +1,76 @@ +Name: zint +Version: 2.4.3 +Release: 10 +Summary: Barcode generator library +License: BSD-2.0 +URL: http://www.zint.org.uk +Source: %{name}-%{version}.tar.gz +Group: Development/Libraries + +BuildRequires: cmake +BuildRequires: libpng-devel +#BuildRequires: zlib-devel + +%description +Zint is a C library for encoding data in several barcode variants. The +bundled command-line utility provides a simple interface to the library. +Features of the library: +- Over 50 symbologies including all ISO/IEC standards, like QR codes. +- Unicode translation for symbologies which support Latin-1 and + Kanji character sets. +- Full GS1 support including data verification and automated insertion of + FNC1 characters. +- Support for encoding binary data including NULL (ASCII 0) characters. +- Health Industry Barcode (HIBC) encoding capabilities. +- Output in PNG, EPS and SVG formats with user adjustable sizes and colors. +- Verification stage for SBN, ISBN and ISBN-13 data. + + + +%package devel +Summary: Library and header files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +C library and header files needed to develop applications that use +the Zint library. The API documentation can be found on the project website: +http://www.zint.org.uk/zintSite/Manual.aspx + +%prep +%setup -q + + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +make VERBOSE=1 + + +%install +rm -rf %{buildroot} +make install DESTDIR=%{buildroot} +#rm -rf %{buildroot}/%{_datadir}/cmake + + +%clean +rm -rf $RPM_BUILD_ROOT + + +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig + + +%files +%defattr(-,root,root,-) +#%doc COPYING readme +%{_libdir}/libzint.so.* +%{_datadir}/%{name}/LICENSE + + +%files devel +%defattr(-,root,root,-) +%{_includedir}/%{name}.h +%{_libdir}/libzint.so +%{_datadir}/%{name}/LICENSE +%exclude %{_datadir}/cmake/Modules/FindZint.cmake @@ -0,0 +1,104 @@ +Zint and libzint +---------------- +Zint is a suite of programs to allow easy encoding of data in any of the +wide range of public domain barcode standards and to allow integration of +this capability into your own programs. + +Zint is able to encode data in the following formats: + +Code 11, Standard Code 2 of 5, IATA Code 2 of 5, Industrial Code 2 of 5, +Interleaved Code 2 of 5, Code 2 of 5 Data Logic, ITF-14, Deutche Post +Leitcode, Deutche Post Identcode, UPC-A, UPC-E, EAN-2, EAN-5, EAN-8, +EAN-13, UK Plessey, MSI Plessey, Telepen Alpha, Telepen Numeric, Code 39, +Extended Code 39, Code 93, PZN, Code 23, LOGMARS, Codabar, Pharmacode, Code +128, EAN-128, NVE-18, Code 16k, PDF417, MicroPDF417, Two-Track Pharmacode, +PostNet, PLANET, Australia Post 4-State Symbols, RM4SCC, USPS OneCode, GS1 +DataBar, DataBar-14, DataBar Limited, DataBar Extended, DataBar Stacked, +Composite Symbology, Data Matrix, QR Code, Maxicode, Aztec Code, EAN-13, +Micro QR, Korea Post Barcode, HIBC Code 128, HIBC Code 39, HIBC Data Matrix, +HIBC PDF417, HIBC MicroPDF417, HIBC QR Code, HIBC Aztec Code, Japanese Postal +Code, Code 49, Channel Code, Code One, Grid Matrix, FIM and Flattermarken. + + +PROJECT STATUS +-------------- +Version 2.3.0: +This release features a complete rebuild of QR Code and Micro QR Code +functionality which now: + +* Automatically detects and adjusts to Japanese characters +* Supports GS1 encoding +* Does not require the qrencode library. + +Also new in this release is Grid Matrix support which similarly supports +Chinese character encoding. + +Version 2.3.1: +Correction of some minor bugs in Code 128 and Data Matrix, addition of +--notext option to CLI and better operation of --scale option which now +scales human readable text and MaxiCode. + +SPECIAL NOTE: Codablock-F has now been REMOVED from this project because of +problems implimenting this standard. For full details see the project website. + +Version 2.3.2: +More bug corrections including important corrections to RSS Expanded, +Maxicode and ISBN. + +Version 2.4: +Simplified GUI. Addition of "render" functions provides an API for +glabels. Corrections to 4-state codes. Simplification in QR code. Added +--dump option and support for reading from stdin. + +Version 2.4.1: +Contains bugfixes for Data Matrix and QR Code. Add option to produce multiple +files from the command line. Add option to change font size in PNG images. +Tidy up information for creating Debian packages and for compiling on MS +Visual Studio. Correct bug preventing compilation without PNG support. + +Version 2.4.2: +Fix bugs in batch processing - this now works from the command line. + +CONTACT ME +---------- +The home of libzint is: + + <http://www.sourceforge.net/projects/zint> + +and the home for Zint documentation is: + + <http://www.zint.org.uk> + +For feature requests or bug reports please join the mailing list at + + <https://lists.sourceforge.net/lists/listinfo/zint-barcode> + +or send an e-mail to + + <zint-barcode@lists.sourceforge.net> + +BEFORE POSTING TO THIS LIST +--------------------------- +Please note the following points... +* You do not need to join the list to post messages, although joining + the list will usually mean your request is answered more promptly. +* Zint is primarily developed for Linux. If you are using another platform + then we will be less able to help you, although we will do so if we can. + We cannot provide support for commercial packages such as MS Office or + Crystal Reports. +* Always ensure you are using the latest version of Zint before posting bug + reports - the bug you are reporting may have been fixed already. +* Please remember to state what operating system you are using and include + enough information to allow us to reproduce the error - including input + data if appropriate. +* Please DO NOT post messages asking for us to change the license + arrangements. You will be ignored. If you want a barcode encoder with a + different license then please look elsewhere. +* Please remember that Zint is developed by volunteers - don't be surprised + if we are unable to help you or if it takes a long time to answer your + questions. + +Thanks for your interest in libzint. +Happy encoding. + +Robin. diff --git a/readme-cmake b/readme-cmake new file mode 100644 index 0000000..801b076 --- /dev/null +++ b/readme-cmake @@ -0,0 +1,6 @@ +how to : +mkdir build +cd build +cmake .. +make [-j nr_proc+1] +make install diff --git a/readme-vsx.txt b/readme-vsx.txt new file mode 100644 index 0000000..e40f95f --- /dev/null +++ b/readme-vsx.txt @@ -0,0 +1,30 @@ +Zint can be built with and without PNG support. +To disable PNG support, add NO_PNG prepoocessor define into Visual Studio project files. + +To enable PNG support, zlib and libpng libraries are necessary. +Download zlib source form http://zlib.net +Download libpng source code from http://www.libpng.org/pub/png/libpng.html + +Zint 2.4.1 is linked with zlib 1.2.5 and linpng 1.4.5 + +Unpack downloaded archives. +Open .\win32\vcx\zlib.props and .\win32\vcx\libpng.props files. +Set <LpngSrcDir> element content to unpacked libpng path (absolute or relative). +Set <ZlibSrcDir> element content to unpacked zlib path (absolute or relative). + +Open Visual Studio (Express) and build zint. + +Zint can be built from command line: +Start Windows SDK Command Prompt or Visual Studio Command Prompt. + +cd to win32 directory + +build zlib, libpng, libzint and zint: + +msbuild zlib.vcxproj /t:Build /p:Configuration=Release +msbuild libpng.vcxproj /t:Build /p:Configuration=Release +msbuild libzint.vcxproj /t:Build /p:Configuration=Release +msbuild zint.vcxproj /t:Build /p:Configuration=Release + +zlib125.dll, libpng14.dll, zint.dll and zint.exe are in the Relase directory. +To distribute zint.exe, all 3 dlls need to be shipped with zint.exe. |